浅谈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 相关文章推荐
模仿OSO的论坛(一)
Oct 09 PHP
PHP 获取MySQL数据库里所有表的实现代码
Jul 13 PHP
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
Oct 03 PHP
smarty巧妙处理iframe中内容页的代码
Mar 07 PHP
php中print(),print_r(),echo()的区别详解
Dec 01 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
Mar 21 PHP
php数据访问之查询关键字
May 09 PHP
php unicode编码和字符串互转的方法
Aug 12 PHP
PHP jQuery+Ajax结合写批量删除功能
May 19 PHP
详细解读php的命名空间(二)
Feb 21 PHP
PHP封装的验证码工具类定义与用法示例
Aug 22 PHP
Laravel使用模型实现like模糊查询的例子
Oct 24 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中把美国时间转为北京时间的自定义函数分享
2014/07/28 PHP
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
php实现SAE上使用storage上传与下载文件的方法
2015/06/29 PHP
php+redis实现消息队列功能示例
2019/09/19 PHP
PHP 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
js出生日期 年月日级联菜单示例代码
2014/01/10 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
2014/06/03 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
2015/09/14 Javascript
详解JavaScript的回调函数
2015/11/20 Javascript
JavaScript获取IP获取的是IPV6 如何校验
2016/06/12 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
2017/07/13 jQuery
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
浅谈Vue.js之初始化el以及数据的绑定说明
2019/11/14 Javascript
JavaScript实现联动菜单特效
2020/01/07 Javascript
js+css实现全屏侧边栏
2020/06/16 Javascript
vue实现匀速轮播效果
2020/06/29 Javascript
Python 中 Meta Classes详解
2016/02/13 Python
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
python如何以表格形式打印输出的方法示例
2019/06/21 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
python生成任意频率正弦波方式
2020/02/25 Python
html5教程调用绘图api画简单的圆形代码分享
2013/12/04 HTML / CSS
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
日本小田急百货官网:Odakyu
2018/07/19 全球购物
安全检查验收制度
2014/01/12 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
职员竞岗演讲稿
2014/05/14 职场文书
优秀家长自荐材料
2014/08/26 职场文书
学校党委副书记个人对照检查材料思想汇报
2014/09/28 职场文书
房屋租赁委托书范本
2014/10/04 职场文书
家属联谊会致辞
2015/07/31 职场文书
Nginx HTTP跳转至HTTPS
2022/05/15 Servers
浅谈Redis缓冲区机制
2022/06/05 Redis
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server