浅谈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+AJAX实现无刷新注册(带用户名实时检测)
Dec 02 PHP
php在字符串中查找另一个字符串
Nov 19 PHP
PHP 判断变量类型实现代码
Oct 23 PHP
PHP学习笔记之一
Jan 17 PHP
浅析PHP中strlen和mb_strlen的区别
Aug 31 PHP
php中动态修改ini配置
Oct 14 PHP
对PHP PDO的一些认识小结
Jan 23 PHP
PHP实现懒加载的方法
Mar 07 PHP
php.ini中的request_order推荐设置
May 10 PHP
Zend Framework教程之Zend_Config_Ini用法分析
Mar 23 PHP
php 使用fopen函数创建、打开文件详解及实例代码
Sep 24 PHP
基于php实现的php代码加密解密类完整实例
Oct 12 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
PHP5/ZendEngine2的改进
2006/10/09 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
解析PHP自带的进位制之间的转换函数
2013/06/08 PHP
PHP反向代理类代码
2014/08/15 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
javascript 树控件 比较好用
2009/06/11 Javascript
extjs grid设置某列背景颜色和字体颜色的方法
2010/09/03 Javascript
给页面渲染时间加速 干掉Dom Level 0 Event
2012/12/19 Javascript
JS实现超简洁网页title标题跑动闪烁提示效果代码
2015/10/23 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
JavaScript操作class和style样式代码详解
2016/02/13 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
2017/07/27 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
2017/10/19 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
2018/12/10 Javascript
react koa rematch 如何打造一套服务端渲染架子
2019/06/26 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
微信小程序request请求封装,验签代码实例
2019/12/04 Javascript
解决Django加载静态资源失败的问题
2019/07/28 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
python判断正负数方式
2020/06/03 Python
浅谈Python xlwings 读取Excel文件的正确姿势
2021/02/26 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
澳洲网红粉泥面膜:Sand & Sky
2019/08/13 全球购物
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
编辑找工作求职信分享
2014/01/03 职场文书
爱护公共设施标语
2014/06/24 职场文书
微笑服务标语
2014/06/24 职场文书
家庭贫困证明范本(经典版)
2014/09/22 职场文书
欠条范文
2015/07/03 职场文书
2015年安全生产月工作总结
2015/07/27 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android