浅谈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 远程文件管理,可以给表格排序,遍历目录,时间排序
Aug 07 PHP
深入解析PHP的引用计数机制
Jun 14 PHP
windows下配置apache+php+mysql时出现问题的处理方法
Jun 20 PHP
几个实用的PHP内置函数使用指南
Nov 27 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
PHP合并discuz用户脚本的方法
Aug 04 PHP
PHP实现根据时间戳获取周几的方法
Feb 26 PHP
全面解读PHP的Yii框架中的日志功能
Mar 17 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
Nov 28 PHP
php中namespace及use用法分析
Dec 06 PHP
php安装扩展mysqli的实现步骤及报错解决办法
Sep 23 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
Oct 08 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
php实现爬取和分析知乎用户数据
2016/01/26 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
2017/12/13 PHP
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
Jquery实现的tab效果可以指定默认显示第几页
2013/10/16 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
jQuery如何防止这种冒泡事件发生
2015/02/27 Javascript
初识angular框架后的所思所想
2016/02/19 Javascript
Javascript中call,apply,bind方法的详解与总结
2016/12/12 Javascript
js实现瀑布流效果(自动生成新的内容)
2017/03/16 Javascript
Bootstrap下拉菜单Dropdowns的实现代码
2017/03/17 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
2017/05/12 Javascript
Node.js学习之TCP/IP数据通讯(实例讲解)
2017/10/11 Javascript
vue通过video.js解决m3u8视频播放格式的方法
2019/07/30 Javascript
vue点击当前路由高亮小案例
2019/09/26 Javascript
Vue项目打包编译优化方案
2020/09/16 Javascript
vue使用screenfull插件实现全屏功能
2020/09/17 Javascript
javascript实现多边形碰撞检测
2020/10/24 Javascript
python检测远程端口是否打开的方法
2015/03/14 Python
Python实现的凯撒密码算法示例
2018/04/12 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
pandas 时间格式转换的实现
2019/07/06 Python
python基于socket进行端口转发实现后门隐藏的示例
2019/07/25 Python
关于Tensorflow 模型持久化详解
2020/02/12 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
廉价连衣裙和婚纱礼服在线销售:Tbdress
2019/02/28 全球购物
财务出纳岗位职责
2014/02/03 职场文书
外国人聘用意向书
2014/04/01 职场文书
教师见习期自我鉴定
2014/04/28 职场文书
招商引资工作汇报
2014/10/28 职场文书
2014幼儿园保育员工作总结
2014/11/10 职场文书
小学庆六一主持词
2015/06/30 职场文书
PHP新手指南
2021/04/01 PHP