浅谈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 向右侧拉菜单实现代码,测试使用中
Nov 03 PHP
php获取qq用户昵称和在线状态(实例分析)
Oct 27 PHP
深入理解PHP内核(一)
Nov 10 PHP
php实现简单的上传进度条
Nov 17 PHP
PHP7正式版测试,性能惊艳!
Dec 08 PHP
php获取图片信息的方法详解
Dec 10 PHP
最新版本PHP 7 vs HHVM 多角度比较
Feb 14 PHP
thinkPHP5框架auth权限控制类与用法示例
Jun 12 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
Jun 13 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
Oct 12 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
Apr 23 PHP
详解phpstorm2020最新破解方法
Sep 17 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
第十二节 类的自动加载 [12]
2006/10/09 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
2012/10/06 PHP
PHP中ini_set与ini_get用法实例
2014/11/04 PHP
NodeJS 模块开发及发布详解分享
2012/03/07 NodeJs
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
jquery定时滑出可最小化的底部提示层特效代码
2013/10/02 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
8个实用的jQuery技巧
2014/03/04 Javascript
滚动条响应鼠标滑轮事件实现上下滚动的js代码
2014/06/30 Javascript
smartcrop.js智能图片裁剪库
2015/10/14 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
js字符串引用的两种方式(必看)
2016/09/18 Javascript
js原生实现FastClick事件的实例
2016/11/20 Javascript
微信小程序封装自定义弹窗的实现代码
2019/05/08 Javascript
layui表格数据复选框回显设置方法
2019/09/13 Javascript
JQuery表单元素取值赋值方法总结
2020/05/12 jQuery
vue实现滚动鼠标滚轮切换页面
2020/12/13 Vue.js
用Python进行行为驱动开发的入门教程
2015/04/23 Python
Python对excel文档的操作方法详解
2018/12/10 Python
解决使用PyCharm时无法启动控制台的问题
2019/01/19 Python
使用pycharm设置控制台不换行的操作方法
2019/01/19 Python
Python 实现王者荣耀中的敏感词过滤示例
2019/01/21 Python
Django网络框架之HelloDjango项目创建教程
2019/06/06 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
django ModelForm修改显示缩略图 imagefield类型的实例
2019/07/28 Python
django admin 添加自定义链接方式
2020/03/11 Python
Python中的全局变量如何理解
2020/06/04 Python
为什么说python适合写爬虫
2020/06/11 Python
TensorFlow低版本代码自动升级为1.0版本
2021/02/20 Python
css3实现的下拉菜单效果示例
2014/01/22 HTML / CSS
HTML5之SVG 2D入门1—SVG(可缩放矢量图形)概述
2013/01/30 HTML / CSS
时尚圣经:The Fashion Bible
2019/03/03 全球购物
捷克街头、运动和滑板一站式商店:BoardStar.cz
2019/10/06 全球购物
学习全国两会精神心得体会范文
2014/03/17 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
车队安全员岗位职责
2015/02/15 职场文书