浅谈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高手?学会“懒惰”的编程
Dec 05 PHP
基于MySQL体系结构的分析
May 02 PHP
深入apache host的配置详解
Jun 09 PHP
php截取中文字符串不乱码的方法
Dec 25 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
Apr 25 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
Apr 11 PHP
PHP处理Ajax请求与Ajax跨域问题
Feb 13 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
Mar 02 PHP
PHP批量删除jQuery操作
Jul 23 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
实例解析php的数据类型
Oct 24 PHP
Yii框架的redis命令使用方法简单示例
Oct 15 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
3.从实例开始
2006/10/09 PHP
PHP动态编译出现Cannot find autoconf的解决方法
2014/11/05 PHP
yii,CI,yaf框架+smarty模板使用方法
2015/12/29 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
PHP swoole和redis异步任务实现方法分析
2019/08/12 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
2019/10/10 PHP
CSS3画一个阴阳八卦图
2021/03/09 HTML / CSS
JS 中document.URL 和 windows.location.href 的区别
2009/11/11 Javascript
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
jq选项卡鼠标延迟的插件实例
2013/05/13 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
2015/01/23 Javascript
JavaScript位移运算符(无符号) &gt;&gt;&gt; 三个大于号 的使用方法详解
2016/03/31 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
[原创]JS基于FileSaver.js插件实现文件保存功能示例
2016/12/08 Javascript
jQuery获取Table某列的值(推荐)
2017/03/03 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
2017/09/25 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
详解vue中使用微信jssdk
2019/04/19 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
在vue中使用echarts(折线图的demo,markline用法)
2020/07/20 Javascript
python使用pil生成图片验证码的方法
2015/05/08 Python
python实现将html表格转换成CSV文件的方法
2015/06/28 Python
python实现的用于搜索文件并进行内容替换的类实例
2015/06/28 Python
python中文件变化监控示例(watchdog)
2017/10/16 Python
Django实现支付宝付款和微信支付的示例代码
2018/07/25 Python
postman模拟访问具有Session的post请求方法
2019/07/15 Python
基于python的docx模块处理word和WPS的docx格式文件方式
2020/02/13 Python
学python需要去培训机构吗
2020/07/01 Python
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
Agoda西班牙:全球特价酒店预订
2017/06/03 全球购物
美国宠物用品网站:Value Pet Supplies
2018/03/17 全球购物
优秀民警事迹材料
2014/01/29 职场文书
简历的自我评价
2014/02/03 职场文书
乡镇干部学习心得体会
2016/01/23 职场文书
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
2022/04/29 Servers