浅谈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 多行多列显示
Aug 15 PHP
php开发环境配置记录
Jan 14 PHP
使ecshop模板中可引用常量的实现方法
Jun 02 PHP
thinkphp 一个页面使用2次分页的实现方法
Jul 15 PHP
php内嵌函数用法实例
Mar 20 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
Aug 11 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
Jan 30 PHP
Yii2实现自定义独立验证器的方法
May 05 PHP
php readfile()修改文件上传大小设置
Aug 11 PHP
PDO::prepare讲解
Jan 29 PHP
php面向对象程序设计入门教程
Jun 22 PHP
使用composer命令加载vendor中的第三方类库 的方法
Jul 09 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
apache配置虚拟主机的方法详解
2013/06/17 PHP
thinkphp 一个页面使用2次分页的实现方法
2013/07/15 PHP
php缩小png图片不损失透明色的解决方法
2013/12/25 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
Prototype使用指南之string.js
2007/01/10 Javascript
JS解析XML的实现代码
2009/11/12 Javascript
类似GMAIL的Ajax信息反馈显示
2010/02/16 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
2011/07/31 Javascript
网站404页面3秒后跳到首页的实例代码
2013/08/16 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
2015/06/19 Javascript
VSCode配置react开发环境的步骤
2017/12/27 Javascript
在Vue组件中获取全局的点击事件方法
2018/09/06 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
python获取标准北京时间的方法
2015/03/24 Python
初学Python函数的笔记整理
2015/04/07 Python
python安装Scrapy图文教程
2017/08/14 Python
python获取代理IP的实例分享
2018/05/07 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
Python 实现Image和Ndarray互相转换
2020/02/19 Python
keras分类模型中的输入数据与标签的维度实例
2020/07/03 Python
Pycharm调试程序技巧小结
2020/08/08 Python
移动端rem布局的两种实现方法
2018/01/03 HTML / CSS
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
世界上最大的罕见唱片、CD和音乐纪念品网上商店:991.com
2018/05/03 全球购物
Cotton On香港网站:澳洲时装连锁品牌
2018/11/01 全球购物
中国一家综合的外贸B2C电子商务网站:DealeXtreme(DX)
2020/03/10 全球购物
护理专科毕业生自荐书范文
2014/02/19 职场文书
幼儿教师国培感言
2014/02/19 职场文书
给老婆大人的检讨书
2014/02/24 职场文书
师范生免费教育协议书范本
2014/10/09 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
2015年团支书工作总结
2015/04/03 职场文书
假如给我三天光明读书笔记
2015/06/26 职场文书
《乘法分配律》教学反思
2016/02/24 职场文书