浅谈PHP发送HTTP请求的几种方式


Posted in PHP onJuly 25, 2017

PHP 开发中我们常用 cURL 方式封装 HTTP 请求,什么是 cURL?

cURL 是一个用来传输数据的工具,支持多种协议,如在 Linux 下用 curl 命令行可以发送各种 HTTP 请求。PHP 的 cURL 是一个底层的库,它能根据不同协议跟各种服务器通讯,HTTP 协议是其中一种。

现代化的 PHP 开发框架中经常会用到一个包,叫做 GuzzleHttp,它是一个 HTTP 客户端,也可以用来发送各种 HTTP 请求,那么它的实现原理是什么,与 cURL 有何不同呢?

Does Guzzle require cURL?

No. Guzzle can use any HTTP handler to send requests. This means that Guzzle can be used with cURL, PHP's stream wrapper, sockets, and non-blocking libraries like React. You just need to configure an HTTP handler to use a different method of sending requests.

这是 GuzzleHttp 文档 FAQ 中的一个 Question,可见 GuzzleHttp 并不依赖 cURL 库,而支持多种发送 HTTP 请求的方式。

PHP 发送 HTTP 请求的方式

那么这里整理一下除了使用 cURL 外 PHP 发送 HTTP 请求的方式。

1.cURL

详细方法:https://3water.com/article/56492.htm

2.stream流的方式

stream_context_create 作用:创建并返回一个文本数据流并应用各种选项,可用于 fopen(), file_get_contents() 等过程的超时设置、代理服务器、请求方式、头信息设置的特殊过程。

以一个 POST 请求为例:

PHP

<?php
/**
 * Created by PhpStorm.
 * User: tanteng
 * Date: 2017/7/22
 * Time: 13:48
 */
function post($url, $data)
{
  $postdata = http_build_query(
    $data
  );

  $opts = array('http' =>
           array(
             'method' => 'POST',
             'header' => 'Content-type: application/x-www-form-urlencoded',
             'content' => $postdata
           )
  );
  $context = stream_context_create($opts);
  $result = file_get_contents($url, false, $context);
  return $result;
}

关于 PHP stream 的介绍文章:https://3water.com/article/68891.htm

3.socket方式

使用套接字建立连接,拼接 HTTP 报文发送数据进行 HTTP 请求。

一个 GET 方式的例子:

PHP

<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
  echo "$errstr ($errno)<br />\n";
} else {
  $out = "GET / HTTP/1.1\r\n";
  $out .= "Host: www.example.com\r\n";
  $out .= "Connection: Close\r\n\r\n";
  fwrite($fp, $out);
  while (!feof($fp)) {
    echo fgets($fp, 128);
  }
  fclose($fp);
}
?>

本文介绍了发送 HTTP 请求的几种不同的方式。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
优化PHP代码的53条建议
Mar 27 PHP
PHP排序算法的复习和总结
Feb 15 PHP
destoon各类调用汇总
Jun 20 PHP
php实现过滤表单提交中html标签的方法
Oct 17 PHP
ThinkPHP模板中数组循环实例
Oct 30 PHP
Laravel 5框架学习之用户认证
Apr 09 PHP
全面了解PHP中的全局变量
Jun 17 PHP
php str_replace替换指定次数的方法详解
May 05 PHP
PHP钩子与简单分发方式实例分析
Sep 04 PHP
CI框架(CodeIgniter)实现的数据库增删改查操作总结
May 23 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
Aug 03 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 PHP
php 删除指定文件夹的实例讲解
Jul 25 #PHP
Laravel5.* 打印出执行的sql语句的方法
Jul 24 #PHP
PHP实现时间比较和时间差计算的方法示例
Jul 24 #PHP
PHP实现的登录页面信息提示功能示例
Jul 24 #PHP
PHP检查网站是否宕机的方法示例
Jul 24 #PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 #PHP
PHP实践教程之过滤、验证、转义与密码详解
Jul 24 #PHP
You might like
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
JavaScript 放大镜 移动镜片效果代码
2011/05/09 Javascript
JS实现的省份级联实例代码
2013/06/24 Javascript
解析Javascript中难以理解的11个问题
2013/12/09 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
js实现tab切换效果
2017/02/16 Javascript
js学习总结_选项卡封装(实例讲解)
2017/07/13 Javascript
Nodejs使用Mongodb存储与提供后端CRD服务详解
2018/09/04 NodeJs
微信小程序动画(Animation)的实现及执行步骤
2018/10/28 Javascript
uploadify插件实现多个图片上传并预览
2019/09/30 Javascript
vue.js实现三级菜单效果
2019/10/19 Javascript
通过实例了解Render Props回调地狱解决方案
2020/11/04 Javascript
Vue实现一种简单的无限循环滚动动画的示例
2021/01/10 Vue.js
Python使用django获取用户IP地址的方法
2015/05/11 Python
Python实现截屏的函数
2015/07/26 Python
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
python 2.7.13 安装配置方法图文教程
2018/09/18 Python
对Python中内置异常层次结构详解
2018/10/18 Python
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
详解Python 函数如何重载?
2019/04/23 Python
Django框架之DRF 基于mixins来封装的视图详解
2019/07/23 Python
使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示
2020/05/16 Python
python实现二分查找算法
2020/09/18 Python
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
美国在线工具商店:Acme Tools
2018/06/26 全球购物
上学迟到的检讨书
2014/01/11 职场文书
婚礼证婚人证婚词
2014/01/13 职场文书
学校募捐倡议书
2014/05/14 职场文书
会议接待欢迎标语
2014/10/08 职场文书
2014年安全生产工作总结
2014/11/13 职场文书
车间主任岗位职责
2015/02/03 职场文书
pandas中DataFrame重置索引的几种方法
2021/05/24 Python