浅谈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 相关文章推荐
使用Limit参数优化MySQL查询的方法
Nov 12 PHP
几款免费开源的不用数据库的php的cms
Dec 19 PHP
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
Dec 07 PHP
php网站地图生成类示例
Jan 13 PHP
php的一个简单加密解密代码
Jan 14 PHP
php如何解决无法上传大于8M的文件问题
Mar 10 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
Jul 29 PHP
PHP的switch判断语句的“高级”用法详解
Oct 01 PHP
微信公众平台消息接口校验与消息接口响应实例
Dec 23 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
Nov 08 PHP
PHP中的Iterator迭代对象属性详解
Apr 12 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
Dec 12 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
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
php使用递归函数实现数字累加的方法
2015/03/16 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
2015/01/01 NodeJs
js中this的用法实例分析
2015/01/10 Javascript
JavaScript插件化开发教程 (三)
2015/01/27 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
JS实现n秒后自动跳转的两种方法
2020/11/30 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
2018/01/07 Javascript
Vue2.0实现组件数据的双向绑定问题
2018/03/06 Javascript
js实现左右两侧浮动广告
2018/07/09 Javascript
从0到1构建vueSSR项目之node以及vue-cli3的配置
2019/03/07 Javascript
js实现图片实时时钟
2020/01/15 Javascript
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
举例讲解Python面向对象编程中类的继承
2016/06/17 Python
python实现数据图表
2017/07/29 Python
python画出三角形外接圆和内切圆的方法
2018/01/25 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
python中如何写类
2020/06/29 Python
HTML5仿手机微信聊天界面
2016/03/18 HTML / CSS
浅谈html5 响应式布局
2014/12/24 HTML / CSS
酒店工作职员求职简历的自我评价
2013/10/23 职场文书
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
《雾凇》教学反思
2014/02/17 职场文书
2014年度考核工作总结
2014/12/24 职场文书
我在伊朗长大观后感
2015/06/16 职场文书
驾驶员管理制度范本
2015/08/06 职场文书
抖音短视频(douyin)去水印工具的实现代码
2021/03/30 Javascript
AudioContext 实现音频可视化(web技术分享)
2022/02/24 Javascript
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
2022/04/04 Python
Win11右下角图标点了没反应怎么办?Win11点击右下角图标无反应解决方法汇总
2022/07/07 数码科技