浅谈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学习之PHP运算符
Oct 09 PHP
用PHP实现多服务器共享SESSION数据的方法
Mar 16 PHP
PHP下escape解码函数的实现方法
Aug 08 PHP
php学习笔记 [预定义数组(超全局数组)]
Jun 09 PHP
CodeIgniter中实现泛域名解析
Jul 19 PHP
PHP命名空间(namespace)的使用基础及示例
Aug 18 PHP
nginx+thinkphp下解决不支持pathinfo模式
Jul 01 PHP
教你php如何实现验证码
Jan 20 PHP
简单解决微信文章图片防盗链问题
Dec 17 PHP
PHP使用strrev翻转中文乱码问题的解决方法
Jan 13 PHP
Thinkphp 框架扩展之驱动扩展实例分析
Apr 27 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
怎么样可以把 phpinfo()屏蔽掉?
2006/11/24 PHP
PHP加密函数 Javascript/Js 解密函数
2013/09/23 PHP
php实现发送微信模板消息的方法
2015/03/07 PHP
php递归遍历多维数组的方法
2015/04/18 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
CodeIgniter框架钩子机制实现方法【hooks类】
2018/08/21 PHP
laravel 解决crontab不执行的问题
2019/10/22 PHP
JavaScript 事件的一些重要说明
2009/10/25 Javascript
JavaScript 学习笔记(十三)Dom创建表格
2010/01/21 Javascript
css样式标签和js语法属性区别
2013/11/06 Javascript
Bootstrap 源代码分析(未完待续)
2016/08/17 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
2016/11/15 Javascript
AngularJS 验证码60秒倒计时功能的实现
2017/06/05 Javascript
vue vuex vue-rouert后台项目——权限路由(适合初学)
2017/12/29 Javascript
Vue.js实现的计算器功能完整示例
2018/07/11 Javascript
Bootstrap Table实现定时刷新数据的方法
2018/08/13 Javascript
nodejs分离html文件里面的js和css的方法
2019/04/09 NodeJs
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
2020/03/10 Javascript
在Python中使用第三方模块的教程
2015/04/27 Python
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
利用python解决mysql视图导入导出依赖的问题
2017/12/17 Python
python实现将汉字保存成文本的方法
2018/11/16 Python
在Python3 numpy中mean和average的区别详解
2019/08/24 Python
python wsgiref源码解析
2021/02/06 Python
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
Currentbody美国/加拿大:美容仪专家
2020/03/09 全球购物
测绘工程本科生求职信
2013/10/10 职场文书
文秘人员工作职责
2014/01/31 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
2019年第四季度财务部门工作计划
2019/11/02 职场文书
导游词之西安骊山
2019/12/20 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL
Django中session进行权限管理的使用
2021/07/09 Python