浅谈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 相关文章推荐
五款常用mysql slow log分析工具的比较分析
May 22 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
May 08 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
Nov 19 PHP
PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍
Jan 20 PHP
php_pdo 预处理语句详解
Nov 21 PHP
详解PHP处理密码的几种方式
Nov 30 PHP
thinkphp项目如何自定义微信分享描述内容
Feb 20 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
Jun 19 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
phpStudy 2016 使用教程详解(支持PHP7)
Oct 18 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
Feb 20 PHP
PHP数组Key强制类型转换实现原理解析
Sep 01 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批量删除数据库下指定前缀的表以prefix_为例
2014/08/24 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
javascript 点击整页变灰的效果(可做退出效果)。
2008/01/09 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
Javascript实现真实字符串剩余字数提示的实例代码
2013/10/22 Javascript
javascript Array.prototype.slice的使用示例
2013/11/14 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
2013/11/20 Javascript
直接在JS里创建JSON数据然后遍历使用
2014/07/25 Javascript
javascript 自定义回调函数示例代码
2014/09/26 Javascript
JavaScript中的方法调用详细介绍
2014/12/30 Javascript
深入探讨JavaScript String对象
2015/03/09 Javascript
整理Javascript基础语法学习笔记
2015/11/29 Javascript
浅谈Sticky组件的改进实现
2016/03/22 Javascript
js 弹出虚拟键盘修改密码的简单实例
2016/10/10 Javascript
基于Phantomjs生成PDF的实现方法
2016/11/07 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
原生js实现轮播图
2017/02/27 Javascript
create-react-app修改为多页面支持的方法
2018/05/17 Javascript
electron-vue利用webpack打包实现多页面的入口文件问题
2019/05/12 Javascript
微信小程序mpvue点击按钮获取button值的方法
2019/05/29 Javascript
electron 安装,调试,打包的具体使用
2019/11/06 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
2020/05/25 Javascript
Python GAE、Django导出Excel的方法
2008/11/24 Python
仅用500行Python代码实现一个英文解析器的教程
2015/04/02 Python
使用Python中的线程进行网络编程的入门教程
2015/04/15 Python
Python 基于Twisted框架的文件夹网络传输源码
2016/08/28 Python
基于树莓派的语音对话机器人
2019/06/17 Python
一行python实现树形结构的方法
2019/08/09 Python
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
python 绘制正态曲线的示例
2020/09/24 Python
详解Python中第三方库Faker
2020/09/25 Python
彪马俄罗斯官网:PUMA俄罗斯
2019/07/13 全球购物
电钳工人个人求职信
2014/05/10 职场文书
男方家长婚礼致辞
2015/07/27 职场文书
JavaScript中MutationObServer监听DOM元素详情
2021/11/27 Javascript