浅谈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缩略图生成程式(需要GD库支持)
Mar 06 PHP
PHP 木马攻击防御技巧
Jun 13 PHP
基于php伪静态的实现详细介绍
Apr 28 PHP
用php制作简单分页(从数据库读取记录)的方法详解
May 04 PHP
php检测网页是否被百度收录的函数代码
Oct 09 PHP
Linux编译升级php的详细方法
Nov 04 PHP
php实现图片上传并利用ImageMagick生成缩略图
Mar 14 PHP
利用switch语句进行多选一判断的实例代码
Nov 14 PHP
PHP中大括号'{}'用法实例总结
Feb 08 PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
Aug 04 PHP
php写app用的框架整理
Sep 29 PHP
Laravel框架Eloquent ORM修改数据操作示例
Dec 03 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中的Class的几点个人看法
2006/10/09 PHP
使用PHP数组实现无限分类,不使用数据库,不使用递归.
2006/12/09 PHP
PHP 网站修改默认访问文件的nginx配置
2017/05/27 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
YII框架页面缓存操作示例
2019/04/29 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
2019/11/13 PHP
javascript 设置某DIV区域内的checkbox复选框
2009/11/30 Javascript
在JavaScript中获取请求的URL参数[正则]
2010/12/25 Javascript
JavaScript中的null和undefined解析
2012/04/14 Javascript
特殊情况下如何获取span里面的值
2014/05/20 Javascript
JavaScript中日期的相关操作方法总结
2015/10/24 Javascript
JavaScript在网页中画圆的函数arc使用方法
2015/11/13 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
又一枚精彩的弹幕效果jQuery实现
2016/07/25 Javascript
CSS+jQuery实现简单的折叠菜单
2016/12/20 Javascript
深入理解Vuex 模块化(module)
2017/09/26 Javascript
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
解读ES6中class关键字
2017/11/20 Javascript
Vue 使用中的小技巧
2018/04/26 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
2018/05/16 Javascript
Vue 实现点击空白处隐藏某节点的三种方式(指令、普通、遮罩)
2019/10/23 Javascript
使用Vant完成通知栏Notify的提示操作
2020/11/11 Javascript
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
keep-alive保持组件状态的方法
2020/12/02 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
Python PyQt5实现的简易计算器功能示例
2017/08/23 Python
python3实现名片管理系统
2020/11/29 Python
对PyQt5中树结构的实现方法详解
2019/06/17 Python
Django基础三之视图函数的使用方法
2019/07/18 Python
如何写python的配置文件
2020/06/07 Python
Python文件操作及内置函数flush原理解析
2020/10/13 Python
英国知名化妆品网站:Revolution Beauty(原TAM Beauty)
2018/02/28 全球购物
个人简历自我评价八例
2013/10/31 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
离婚协议书样本
2015/01/26 职场文书
【海涛DOTA】D-cup邀请赛NV.cn vs DT.Love
2022/04/01 DOTA