浅谈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 Google的translate API代码
Dec 10 PHP
PHP set_time_limit(0)长连接的实现分析
Mar 02 PHP
php gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
May 15 PHP
PHP正确配置mysql(apache环境)
Aug 28 PHP
PHP setcookie指定domain参数后,在IE下设置cookie失效的解决方法
Sep 09 PHP
第四章 php数学运算
Dec 30 PHP
一个比较不错的PHP日历类分享
Nov 18 PHP
php中获取主机名、协议及IP地址的方法
Nov 18 PHP
php身份证号码检查类实例
Jun 18 PHP
使用PHP如何实现高效安全的ftp服务器(一)
Dec 20 PHP
PHP与Ajax相结合实现登录验证小Demo
Mar 16 PHP
搭建自己的PHP MVC框架详解
Aug 16 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使用ActiveMQ实现消息队列的方法详解
2019/05/31 PHP
jQuery 版本的文本输入框检查器Input Check
2009/07/09 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
原生JavaScript编写俄罗斯方块
2015/03/30 Javascript
js实现新年倒计时效果
2015/12/10 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
2016/03/11 Javascript
BootStrap select2 动态改变值的方法
2017/02/10 Javascript
jquery实现的table排序功能示例
2017/03/10 Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
2017/08/28 Javascript
jQuery实现的简单对话框拖动功能示例
2018/06/05 jQuery
bootstrap 弹出框modal添加垂直方向滚轴效果
2018/07/09 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
解决vue动态下拉菜单 有数据未反应的问题
2020/08/06 Javascript
浅谈vue使用axios的回调函数中this不指向vue实例,为undefined
2020/09/21 Javascript
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
浅要分析Python程序与C程序的结合使用
2015/04/07 Python
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
Python3使用requests发闪存的方法
2016/05/11 Python
python if not in 多条件判断代码
2016/09/21 Python
python中文乱码不着急,先看懂字节和字符
2017/12/20 Python
Random 在 Python 中的使用方法
2018/08/09 Python
matplotlib图例legend语法及设置的方法
2020/07/28 Python
python实现经典排序算法的示例代码
2021/02/07 Python
利用三角函数在canvas上画虚线的方法
2018/01/11 HTML / CSS
金讯Java笔试题目
2013/06/18 面试题
广告学毕业生求职信
2014/01/30 职场文书
某某同志考察材料
2014/05/28 职场文书
档案保密承诺书
2014/06/03 职场文书
2014年应急管理工作总结
2014/11/26 职场文书
创先争优承诺书
2015/01/20 职场文书
2015年档案管理员工作总结
2015/05/13 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
详解分布式系统中如何用python实现Paxos
2021/05/18 Python
MySql子查询IN的执行和优化的实现
2021/08/02 MySQL
世界十大动漫制作公司排行榜,迪士尼上榜,第二是美国代表性文化符
2022/03/18 欧美动漫