浅谈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执行速度全攻略
Oct 09 PHP
PHP中PDO基础教程 入门级
Sep 04 PHP
PHP中将网页导出为Word文档的代码
May 25 PHP
分享一下贝贝成长进度的php代码
Sep 14 PHP
php ckeditor上传图片文件名乱码解决方法
Nov 15 PHP
php替换字符串中间字符为省略号的方法
May 04 PHP
PHP的命令行命令使用指南
Aug 18 PHP
Yii2中Restful API原理实例分析
Jul 25 PHP
php基于PDO实现功能强大的MYSQL封装类实例
Feb 27 PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 PHP
如何在Laravel5.8中正确地应用Repository设计模式
Nov 26 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
May 02 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
Discuz7.2版的faq.php SQL注入漏洞分析
2014/08/06 PHP
PHP中读取照片exif信息的方法
2014/08/20 PHP
thinkphp如何获取客户端IP
2015/11/03 PHP
全面解读PHP的Yii框架中的日志功能
2016/03/17 PHP
php的debug相关函数用法示例
2016/07/11 PHP
初学Javascript的一些总结
2008/11/03 Javascript
颜色选择器 Color Picker,IE,Firefox,Opera,Safar
2010/11/25 Javascript
原生js和jQuery写的网页选项卡特效对比
2015/04/27 Javascript
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
js实现继承的5种方式
2015/12/01 Javascript
全面解析Bootstrap图片轮播效果
2015/12/03 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
2016/04/03 Javascript
jquery简单插件制作(fn.extend)完整实例
2016/05/24 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
省市区三级联动jquery实现代码
2020/04/15 Javascript
获取select的value、text值的简单示例(jquery与javascript)
2016/12/07 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
详解express + mock让前后台并行开发
2018/06/06 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
element-ui使用导航栏跳转路由的用法详解
2018/08/22 Javascript
python实现在目录中查找指定文件的方法
2014/11/11 Python
Python 基础知识之字符串处理
2017/01/06 Python
pandas or sql计算前后两行数据间的增值方法
2018/04/20 Python
Python实现处理逆波兰表达式示例
2018/07/30 Python
python 剪切移动文件的实现代码
2018/08/02 Python
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
详解matplotlib绘图样式(style)初探
2021/02/03 Python
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
英国女性时尚鞋类的潮流制造者:Koi Footwear
2018/10/19 全球购物
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
大学校务公开实施方案
2014/03/31 职场文书
2014年国庆节庆祝建国65周年比赛演讲稿
2014/09/21 职场文书
单位工作证明格式模板
2014/10/04 职场文书
终止或解除劳动合同及劳动关系的证明书
2014/10/06 职场文书
2014年质检工作总结
2014/11/26 职场文书
求职信内容一般写什么?
2015/03/20 职场文书