浅谈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 相关文章推荐
封装一个PDO数据库操作类代码
Sep 09 PHP
Search File Contents PHP 搜索目录文本内容的代码
Feb 21 PHP
PHP不用递归实现无限分级的例子分享
Apr 18 PHP
php连接与操作PostgreSQL数据库的方法
Dec 25 PHP
PHP导入导出Excel代码
Jul 07 PHP
PHP比较运算符的详细介绍
Sep 29 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
May 13 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
Jan 17 PHP
PHP简单实现防止SQL注入的方法
Mar 13 PHP
浅谈PHPANALYSIS提取关键字
Mar 08 PHP
PHP实现的操作数组类库定义与用法示例
May 24 PHP
PHP autoload使用方法及步骤详解
Sep 05 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
用Flash图形化数据(一)
2006/10/09 PHP
Php获取金书网的书名的实现代码
2010/06/11 PHP
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
2015/10/08 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
php array_pop 删除数组最后一个元素实例
2016/11/02 PHP
PHP使用文件锁解决高并发问题示例
2018/03/29 PHP
PHP中-&gt;和=&gt;的含义及使用示例解析
2020/08/06 PHP
JavaScript实现简单的拖动效果
2016/07/02 Javascript
基于JavaScript实现在新的tab页打开url
2016/08/04 Javascript
微信小程序小组件 基于Canvas实现直播点赞气泡效果
2020/05/29 Javascript
js回调函数仿360开机
2019/12/26 Javascript
vue登录页实现使用cookie记住7天密码功能的方法
2021/02/18 Vue.js
python实现apahce网站日志分析示例
2014/04/02 Python
python基础教程之常用运算符
2014/08/29 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
django_orm查询性能优化方法
2018/08/20 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
pandas DataFrame 行列索引及值的获取的方法
2019/07/02 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
python 追踪except信息方式
2020/04/25 Python
浅谈django框架集成swagger以及自定义参数问题
2020/07/07 Python
小学教师节活动方案
2014/01/31 职场文书
端午节粽子促销活动方案
2014/02/02 职场文书
中学家长会邀请函
2014/02/03 职场文书
宣传保护环境的公益广告词
2014/03/13 职场文书
我的小天地教学反思
2014/04/30 职场文书
入党介绍人评语
2014/05/06 职场文书
推广活动策划方案
2014/08/23 职场文书
夫妻分居协议书范文
2014/11/26 职场文书
2015年销售员工作总结范文
2015/04/07 职场文书
航班延误投诉信
2015/07/02 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书