浅谈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+mysql扎实个人基本功
Mar 27 PHP
PHP中SESSION使用中的一点经验总结
Mar 30 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
Apr 10 PHP
php操作mongoDB实例分析
Dec 29 PHP
php获取twitter最新消息的方法
Apr 14 PHP
PHP实现图片自动清理的方法
Jul 08 PHP
thinkphp3.2点击刷新生成验证码
Feb 16 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
Apr 02 PHP
PHP类相关知识点实例总结
Sep 28 PHP
PHP页面输出时js设置input框的选中值
Sep 30 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
Mar 01 PHP
如何在Laravel5.8中正确地应用Repository设计模式
Nov 26 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/06/08 PHP
php中mt_rand()随机数函数用法
2014/11/24 PHP
PHP 二维array转换json的实例讲解
2018/08/21 PHP
jQuery 学习入门篇附实例代码
2010/03/16 Javascript
js实现拖拽效果
2015/02/12 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
跟我学习javascript的异步脚本加载
2015/11/20 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
2016/09/14 Javascript
JavaScript定义全局对象的方法示例
2017/01/12 Javascript
jQuery EasyUI Layout实现tabs标签的实例
2017/09/26 jQuery
ES6 fetch函数与后台交互实现
2018/11/14 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
2019/11/12 Javascript
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
python轻松实现代码编码格式转换
2015/03/26 Python
python脚本设置系统时间的两种方法
2016/02/21 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
Django安装配置mysql的方法步骤
2018/10/15 Python
详解用Python实现自动化监控远程服务器
2019/05/18 Python
如何实现Django Rest framework版本控制
2019/07/25 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
2019/10/24 Python
基于python3的socket聊天编程
2020/02/17 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
2020/03/30 Python
Python错误的处理方法
2020/06/23 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
TripAdvisor日本:全球领先的旅游网站
2019/02/14 全球购物
软件测试工程师笔试题带答案
2015/03/27 面试题
酒店led欢迎词
2014/01/09 职场文书
项目投资意向书
2014/04/01 职场文书
测绘工程专业求职信
2014/07/15 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers