浅谈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 检查扩展库或函数是否可用的代码
Apr 06 PHP
php中实现记住密码自动登录的代码
Mar 02 PHP
php中实现简单的ACL 完结篇
Sep 07 PHP
PHP自定义大小验证码的方法详解
Jun 07 PHP
PHP字符串的递增和递减示例介绍
Feb 11 PHP
PHP伪静态Rewrite设置之APACHE篇
Jul 30 PHP
PHP aes (ecb)解密后乱码问题
Jun 22 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
Dec 24 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
Oct 25 PHP
CI框架使用composer安装的依赖包步骤与方法分析
Nov 21 PHP
PHP封装的非对称加密RSA算法示例
May 28 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
Oct 14 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 一个页面执行时间类代码
2010/03/05 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
js 判断checkbox是否选中的操作方法
2012/11/09 Javascript
javascript相等运算符与等同运算符详细介绍
2013/11/09 Javascript
javascript类型转换使用方法
2014/02/08 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
全面解析Bootstrap弹窗的实现方法
2015/12/01 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
js字符串类型String常用操作实例总结
2019/07/05 Javascript
在vue-cli中引入lodash.js并使用详解
2019/11/13 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
[01:00:59]VP VS VG Supermajor小组赛胜者组第二轮 BO3第二场 6.2
2018/06/03 DOTA
python装饰器使用方法实例
2013/11/21 Python
python实现从web抓取文档的方法
2014/09/26 Python
python操作xlsx文件的包openpyxl实例
2018/05/03 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
简单了解为什么python函数后有多个括号
2019/12/19 Python
python 项目目录结构设置
2020/02/14 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
python cv2.resize函数high和width注意事项说明
2020/07/05 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
手机端用rem+scss做适配的详解
2017/11/15 HTML / CSS
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
学生就业推荐信
2013/11/13 职场文书
优秀团支部事迹材料
2014/02/08 职场文书
业务员辞职信范文
2015/03/02 职场文书
2015年大学生工作总结
2015/04/21 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
百家讲坛观后感
2015/06/12 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书
女人创业励志语录,句句蕴含能量,激发你的潜能
2019/08/20 职场文书
Python机器学习应用之工业蒸汽数据分析篇详解
2022/01/18 Python
Python使用华为API为图像设置多个锚点标签
2022/04/12 Python