浅谈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 相关文章推荐
消息持续发送的完整例子
Oct 09 PHP
基于mysql的bbs设计(四)
Oct 09 PHP
php MySQL与分页效率
Jun 04 PHP
PHP 高级课程笔记 面向对象
Jun 21 PHP
php通过COM类调用组件的实现代码
Jan 11 PHP
深入PHP异步执行的详解
Jun 03 PHP
PHP模拟QQ登录的方法
Jul 29 PHP
Symfony2创建页面实例详解
Mar 18 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
Nov 03 PHP
CI框架(CodeIgniter)操作redis的方法详解
Jan 25 PHP
Laravel数据库读写分离配置的方法
Oct 13 PHP
php下的原生ajax请求用法实例分析
Feb 28 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
实用函数8
2007/11/08 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
让PHP显示Facebook的粉丝数量方法
2014/01/08 PHP
PHP将进程作为守护进程的方法
2015/03/19 PHP
php通过分类列表产生分类树数组的方法
2015/04/20 PHP
PHP基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
js获取图片大小的函数代码
2011/09/20 Javascript
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
2012/02/27 Javascript
Javascript 判断是否存在函数的方法
2013/01/03 Javascript
浅析showModalDialog数据缓存问题(用禁止浏览器缓存解决)
2013/07/09 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
微信浏览器内置JavaScript对象WeixinJSBridge使用实例
2015/05/25 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
2016/12/01 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
python3.5实现socket通讯示例(TCP)
2017/02/07 Python
python如何为被装饰的函数保留元数据
2018/03/21 Python
如何使用Python 打印各种三角形
2019/06/28 Python
6行Python代码实现进度条效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI库)
2020/01/06 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
Python3中的tuple函数知识点讲解
2021/01/03 Python
html5的pushstate以及监听浏览器返回事件的实现
2020/08/11 HTML / CSS
html5使用window.postMessage进行跨域实现数据交互的一次实战
2021/02/24 HTML / CSS
ZWILLING双立人法国网上商店:德国刀具锅具厨具品牌
2019/08/28 全球购物
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
2012/09/06 面试题
公益活动策划方案
2014/01/09 职场文书
列车长先进事迹材料
2014/01/25 职场文书
2014年重阳节敬老活动方案
2014/09/16 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
胡桃夹子观后感
2015/06/11 职场文书
求职自我评价参考范文
2019/05/16 职场文书
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis