浅谈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 Class 文章
Apr 04 PHP
php 常用字符串函数总结
Mar 15 PHP
PHP安全防范技巧分享
Nov 03 PHP
ThinkPHP模板Switch标签用法示例
Jun 30 PHP
php利用反射实现插件机制的方法
Mar 14 PHP
使用PHP similar text计算两个字符串相似度
Nov 06 PHP
必须收藏的php实用代码片段
Feb 02 PHP
php实现的后台表格分页功能示例
Oct 23 PHP
PHP获取ttf格式文件字体名的方法示例
Mar 06 PHP
Yii框架ACF(accessController)简单权限控制操作示例
Apr 26 PHP
Laravel框架创建路由的方法详解
Sep 04 PHP
PHP获取类私有属性的3种方法
Sep 10 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
基于session_unset与session_destroy的区别详解
2013/06/03 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
PHP Web木马扫描器代码分享
2015/09/06 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
动态调用css文件——jquery的应用
2007/02/20 Javascript
JQuery 图片延迟加载并等比缩放插件
2009/11/09 Javascript
jQuery中append、insertBefore、after与insertAfter的简单用法与注意事项
2020/04/04 Javascript
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
2011/04/07 Javascript
JavaScript之AOP编程实例
2015/07/17 Javascript
Bootstrap的Refresh Icon也spin起来
2016/07/13 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
jQuery validate 验证radio实例
2017/03/01 Javascript
使用javaScript实现鼠标拖拽事件
2020/04/03 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
JS实现的文字间歇循环滚动效果完整示例
2018/02/13 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
Python yield使用方法示例
2013/12/04 Python
python实现简单socket程序在两台电脑之间传输消息的方法
2015/03/13 Python
用Python shell简化开发
2018/08/08 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
python3 实现函数写文件路径的正确方法
2019/11/27 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
2020/04/13 Python
Python检测端口IP字符串是否合法
2020/06/05 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
Python定时任务框架APScheduler原理及常用代码
2020/10/05 Python
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
班主任工作年限证明
2014/01/12 职场文书
晚宴邀请函范文
2014/01/15 职场文书
小区门卫值班制度
2014/01/24 职场文书
老师对学生的寄语
2014/04/09 职场文书
报到证办理个人委托书
2014/10/06 职场文书
2016年离婚协议书范文
2016/03/18 职场文书
python函数的两种嵌套方法使用
2022/04/02 Python