浅谈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修正代码
May 09 PHP
php 函数中使用static的说明
Jun 01 PHP
IIS6.0中配置php服务全过程解析
Aug 07 PHP
PHP入门经历和学习过程分享
Apr 11 PHP
php设计模式之简单工厂模式详解
Sep 04 PHP
ThinkPHP分组下自定义标签库实例
Nov 01 PHP
php获取文件类型和文件信息的方法
Jul 10 PHP
在php中设置session用memcache来存储的方法总结
Jan 14 PHP
PHP parse_ini_file函数的应用与扩展操作示例
Jan 07 PHP
Laravel5框架自定义错误页面配置操作示例
Apr 17 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
Feb 27 PHP
PHP代码加密的方法总结
Mar 13 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
转生史莱姆:萌王第一次撸串开心到飞起,哥布塔撸串却神似界王神
2018/11/30 日漫
php计算title标题相似比的方法
2015/07/29 PHP
PHP防盗链的基本思想 防盗链的设置方法
2015/09/25 PHP
PHP编程 SSO详细介绍及简单实例
2017/01/13 PHP
PHP中ltrim()函数的用法与实例讲解
2019/03/28 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
一些实用的jQuery代码片段收集
2011/07/12 Javascript
浅谈Javascript面向对象编程
2011/11/15 Javascript
jQuery.query.js 取参数的两点问题分析
2012/08/06 Javascript
jquery获取特定name所有选中的checkbox,支持IE9标准模式
2013/03/18 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
JQuery表格内容过滤的实现方法
2013/07/05 Javascript
通过js简单实现将一个文本内容转译成加密文本
2013/10/22 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
2016/07/01 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
2016/12/07 Javascript
AngularJS 中ui-view传参的实例详解
2017/08/25 Javascript
vuex 的简单使用
2018/03/22 Javascript
在node环境下parse Smarty模板的使用示例代码
2019/11/15 Javascript
vue实现选中效果
2020/10/07 Javascript
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
python 使用get_argument获取url query参数
2017/04/28 Python
python打印异常信息的两种实现方式
2019/12/24 Python
tensorflow多维张量计算实例
2020/02/11 Python
vue学习笔记之动态组件和v-once指令简单示例
2020/02/29 Python
在python中使用nohup命令说明
2020/04/16 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
北京大学自荐信范文
2014/01/28 职场文书
房屋买卖协议书范本
2014/04/10 职场文书
水利水电建筑施工应届生求职信
2014/07/04 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
青年志愿者活动感想
2015/08/07 职场文书
2015年高三毕业班班主任工作总结
2015/10/22 职场文书
Python基础之hashlib模块详解
2021/05/06 Python
Golang生成Excel文档的方法步骤
2021/06/09 Golang