浅谈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字符串截取问题
Nov 28 PHP
php 智能404跳转代码,适合换域名没改变目录的网站
Jun 04 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
May 15 PHP
smarty内置函数foreach用法实例
Jan 22 PHP
php实现检查文章是否被百度收录
Jan 27 PHP
PHP实现自动对图片进行滚动显示的方法
Mar 12 PHP
php在apache环境下实现gzip配置方法
Apr 02 PHP
php版微信发红包接口用法示例
Sep 23 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
Dec 19 PHP
php文件管理基本功能简单操作
Jan 16 PHP
laravel 判断查询数据库返回值的例子
Oct 11 PHP
PHP数组对象与Json转换操作实例分析
Oct 22 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缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
PHP简单生成缩略图相册的方法
2015/07/29 PHP
PHP7 新增功能
2021/03/09 PHP
JavaScript面向对象之体会[总结]
2008/11/13 Javascript
parseInt parseFloat js字符串转换数字
2010/08/01 Javascript
javascript循环变量注册dom事件 之强大的闭包
2010/09/08 Javascript
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
2015/10/19 Javascript
JavaScript获取各大浏览器信息图示
2015/11/20 Javascript
实例详解jQuery表单验证插件validate
2016/01/18 Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
2016/08/09 Javascript
原生js的RSA和AES加密解密算法
2016/10/08 Javascript
JQuery页面随滚动条动态加载效果的简单实现(推荐)
2017/02/08 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
Angular实现预加载延迟模块的示例
2017/10/12 Javascript
layui实现点击按钮给table添加一行
2018/08/10 Javascript
深入理解nodejs搭建静态服务器(实现命令行)
2019/02/05 NodeJs
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
如何在selenium中使用js实现定位
2020/08/18 Javascript
[04:19]DOTA2完美大师赛第四天精彩集锦
2017/11/26 DOTA
连接Python程序与MySQL的教程
2015/04/29 Python
python利用拉链法实现字典方法示例
2017/03/25 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
Python json转字典字符方法实例解析
2020/04/13 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
2020/04/27 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
Charlotte Tilbury澳大利亚官网:英国美妆品牌
2018/10/05 全球购物
解释一下钝化(Swap out)
2016/12/26 面试题
Python如何实现单例模式
2016/06/03 面试题
给公司的建议书范文
2014/05/13 职场文书
闭幕词的写作格式与范文!
2019/06/24 职场文书