浅谈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 相关文章推荐
Oracle Faq(Oracle的版本)
Oct 09 PHP
example2.php
Oct 09 PHP
php采集速度探究总结(原创)
Apr 18 PHP
php5 pdo新改动加载注意事项
Sep 11 PHP
PHP生成随机密码类分享
Jun 25 PHP
PHP响应post请求上传文件的方法
Dec 17 PHP
php bootstrap实现简单登录
Mar 08 PHP
Zend Framework常用校验器详解
Dec 09 PHP
php微信公众号开发(4)php实现自定义关键字回复
Dec 15 PHP
yii2利用自带UploadedFile实现上传图片的示例
Feb 16 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
Jul 16 PHP
PHP实现网站应用微信登录功能详解
Apr 11 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
DOTA2 1月28日更新:监管系统降临刀塔世界
2021/01/28 DOTA
php命令行使用方法和命令行参数说明
2014/04/08 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
详解PHP用substr函数截取字符串中的某部分
2016/12/03 PHP
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
window.dialogArguments 使用说明
2011/04/11 Javascript
javascript动态加载二
2012/08/22 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
jQuery实现冻结表格行和列
2015/04/29 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
javascript瀑布流式图片懒加载实例
2020/06/28 Javascript
jQuery模仿单选按钮选中效果
2016/06/24 Javascript
jquery轮播的实现方式 附完整实例
2016/07/28 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
React Native 真机断点调试+跨域资源加载出错问题的解决方法
2018/01/18 Javascript
JavaScript+H5实现微信摇一摇功能
2018/05/23 Javascript
Vue 项目分环境打包的方法示例
2018/08/03 Javascript
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
flask框架视图函数用法示例
2018/07/19 Python
python矩阵/字典实现最短路径算法
2019/01/17 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
详解python polyscope库的安装和例程
2020/11/13 Python
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
全球最大的服务市场:Fiverr
2017/01/03 全球购物
教育专业毕业生推荐信
2014/07/10 职场文书
房地产营销活动策划方案
2014/09/15 职场文书
产品陈列协议书(标准版)
2014/09/17 职场文书
写给纪委的违纪检讨书
2015/05/05 职场文书
学雷锋广播稿大全
2015/08/19 职场文书