在PHP后端的开发过程中,除了获取数据库的数据和处理数据的内部逻辑,往往还需要请求其他服务器接口的数据,我们一般有3种方式来获取数据,分别是:

file_get_contents

fsockopen

curl

3种常用的接口获取方式简述

file_get_contents

函数声明:

/** 函数作用:将整个文件读入字符串

@param $filename 读取的文件名或url,如果是文件路径,$use_include_path需置为true

@param $use_include_path 是否使用文件目录路径查找,如果是文件查找,需要置为true,默认为false

@param $context 资源参数,使用stream_context_create创造的一个上下文,用于配置读取文件的参数,如配置HTTP请求的方法和头部信息

@param $offset 开始读取数据的偏移值

@param $maxlen 从$offset开始获取多长的数据

@return string 如果成功返回字符串,失败返回false

*/

string file_get_contents(string $filename, bool $use_include_path = false, resource $context, int $offset = -1, int $maxlen)

实例获取数据:

// 笔者开发使用Yii2,所以路由控制器使用action的写法

public function actionFetch() {

// 该url为笔者写的另外一篇文章,测试用

$data = file_get_contents('https://segmentfault.com/a/1190000011549088');

// 获取到的数据需要输出我们才能在前端请求看到返回的结果

echo $data;

// 结束本次请求

return $data;

}

fsockopen

函数声明:

/** 函数作用:打开一个网络连接或者一个Unix套接字连接

@param $hostname 初始化套接字连接到的主机

@param $port 端口号,如果不传递,则不实用端口

@param $errno

@param $errstr 字符串形式的错误信息

@param $timeout 超时时间,单位为s

@return resource 如果成功返回文件句柄,可以使用文件函数读写,失败返回false

*/

resource fsockopen(string $hostname, int $port = -1, int &$errno, string &$errstr, float $timeout = ini_get("default_socket_timeout"))

实例获取数据:

注意:在我的测试环境中报错:`Unable to find the socket transport "http" - did you

forget to enable it when you configured

PHP?`,是由于php.ini配置问题,所以不推荐此种方法获取,因为受配置文件影响,很容易不可用。

// 笔者开发使用Yii2,所以路由控制器使用action的写法

$fp = fsockopen('https://segmentfault.com/a/1190000011549088', 80);

if (!$fp) {

echo "$errstr ($errno)
\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);

}

cURL

需要安装libcurl包。

cURL全称commandLine Uniform Resource Locator,命令行统一资源定位器,用于在命令行上传和下载url文件。提供用于程序开发的libcurl包。

实例获取数据:

// 初始化一个curl资源

$ch = curl_init('https://segmentfault.com/a/1190000011549088');

// 执行该curl对象,返回结果

$data = curl_exec($ch);

// 关闭cURL资源,释放系统资源

curl_close($ch);

3种方式的优劣对比

在代码风格上,file_get_contents最为简洁,fsockopen和curl比较复杂。

在配置头部信息上:

file_get_contents通过stream_context_set_option()来配置头部信息;

fsockopen可以通过fwirte ($socket, $config)的方式或字符串拼接配置请求头部信息,支持异步请求;

curl可以通过curl_setopt($curl, $name, $key)的方式配置请求配置,作为lib库,功能强大。

PHP不支持多进程,如果需要异步请求,非阻塞的方式,请选择fsockopen。

常规的请求我们使用file_get_contents和curl,除了功能外,下面做一个性能测试:

$url = 'https://segmentfault.com/a/1190000011549088';

// 100次file_get_contents请求,结果为113s

$start = time();

for ($i = 0; $i < 100; $i++) {

$data = file_get_contents($url);

}

$end = time();

$cost = $end - $start;

echo 'file_get_contents 100次总耗时:', "$cost";

// 100次curl请求,结果为48s

$start = time();

for ($i = 0; $i < 100; $i++) {

$ch = curl_init($url);

// 设置不直接输出结果,而是保存到$data中

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$data = curl_exec($ch);

}

$end = time();

$cost = $end - $start;

echo 'curl 100次总耗时:', "$cost";

所以,在常规PHP请求中,我们使用curl的方式来请求接口数据。

cURL详解

curl的基本使用方法就是:

curl_init()初始化cURL会话

curl_setopt()或curl_setopt_array()设置配置选项

curl_exec()执行会话

curl_close()关闭会话

curl_init()

函数声明:

/** 函数作用:初始化curl会话

@param $url 配置中的请求url,如果不传递,需要在curl_setopt()设置CURLOPT_URL

@return resource 如果成功返回cURL句柄,失败返回false

*/

resource curl_init([string $url = NULL])

curl_setopt()和curl_setopt_array()

函数声明:

/** 函数作用:设置cURL传输选项

@param $ch curl_init()返回的cURL句柄

@param $option 需要设置的CURLOPT_XXX选项

@param $value 在option选项上设置的值

@return bool 成功返回true,失败返回false

*/

bool curl_setopt(resource $ch, int $option, mixed $value)

/** 函数作用:设置cURL传输选项

@param $ch curl_init()返回的cURL句柄

@param $options 需要设置的CURLOPT_XXX选项和值的数组

@return bool 全部成功返回true,一个失败立刻返回false

*/

bool curl_setopt_array(resource $ch, array $options)

使用实例:

// 设置url和不直接输出结果,单项设置

curl_setopt($ch, CURLOPT_URL, 'https://segmentfault.com/a/1190000011549088');

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// 批量设置

curl_setopt_array($ch, array(

CURLOPT_URL => 'https://segmentfault.com/a/1190000011549088',

CURLOPT_RETURNTRANSFER => true

));

CURLOPT_参数

列举一些常用的参数,全部参数可以在 PHP curl参数文档 查阅。

CURLOPT_HEADER 启用时会将头文件的信息作为数据流输出。

CURLOPT_POST TRUE 时会发送 POST 请求,类型为:application/x-www-form-urlencoded,是 HTML 表单提交时最常见的一种。

CURLOPT_RETURNTRANSFER TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出。

CURLOPT_UPLOAD TRUE 准备上传。

CURLOPT_CONNECTTIMEOUT 在尝试连接时等待的秒数。设置为0,则无限等待。

CURLOPT_PORT 用来指定连接端口。

CURLOPT_TIMEOUT 允许 cURL 函数执行的最长秒数。

CURLOPT_COOKIE 设定 HTTP 请求中"Cookie: "部分的内容。多个 cookie 用分号分隔,分号后带一个空格(例如, "fruit=apple; colour=red")。

CURLOPT_POSTFIELDS 全部数据使用HTTP协议中的 "POST" 操作来发送。该参数只支持一维数组,如果需要传递多维数组,需要使用http_build_query处理,更详细的信息可以查看PHP cURL请求中CURLOPT_POSTFIELDS只支持一维数组这篇文章。

CURLOPT_URL 需要获取的 URL 地址,也可以在curl_init() 初始化会话的时候。

curl_exec()

函数声明:

/** 函数作用:执行curl会话

@param $ch curl_init()返回的cURL句柄

@return mixed 成功返回true,失败返回false;如果设置了CURLOPT_RETRUNTRANSFER为ture,成功返回执行结果

*/

mixed curl_exec(resource $ch)

curl_close()

函数声明:

/** 函数作用:关闭curl会话

@param $ch curl_init()返回的cURL句柄

@return void

*/

void curl_close(resource $ch)

curl请求封装

public static function parseApi($vars = Array(), $timeout = 60, $uri = '') {

// 初始化curl

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $uri);

// 支持POST请求

curl_setopt($ch, CURLOPT_POST, 1);

// 不直接输出,返回到变量

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// 设置POST参数

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($vars));

// 设置超时,防止机器被大量超时请求卡死

curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);

// 请求数据

$response = curl_exec($ch);

// 关闭请求

curl_close($ch);

// 对数据进行编码,方便前后端数据处理

$result = json_decode($response, true);

// PHP返回数据

return $result;

}

PHP cURL并行请求

除了上面的curl_init之外,cURL还支持curl_multi_init并行请求,允许我们同时请求上百个接口,而不是foreach轮询阻塞式的请求。详细的可以查看我的另一篇文章:PHP实现并发请求。

总结

如果你需要非阻塞的请求,可以使用fsockopen()方法。

常规的使用curl来请求,功能强大,使用方便,按需配置。

参考资料

php curlget方法_PHP cURL请求详解相关推荐

  1. Linux curl命令使用代理、以及代理种类介绍(附:curl命令详解)

    目录 一.代理服务器分类: 二.Linux curl命令代理设置参数: 三.Linux curl命令设置代理举例: 1.linux curl命令设置http代理: 2.Linux curl命令设置so ...

  2. linux curl命令详解(附使用示例)

    Linux curl命令详解 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具,但按传统,习惯称u ...

  3. Linux中curl命令详解(做定时任务超级有用)!

    Linux curl命令详解 命令:curl 在kingle中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具, ...

  4. JavaEE基础(03):Http请求详解,握手挥手流程简介

    本文源码:GitHub·点这里 || GitEE·点这里 一.Http协议简介 1.概念说明 HTTP超文本传输协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议,基于TCP/IP通信协议来传 ...

  5. PHP curl 参数详解

    PHP curl参数详解,分享一下. curl_setopt (PHP 4 >= 4.0.2) curl_setopt -- 为CURL调用设置一个选项 描述 bool curl_setopt ...

  6. java web流量阀值_Javaweb应用使用限流处理大量的并发请求详解

    在web应用中,同一时间有大量的客户端请求同时发送到服务器,例如抢购.秒杀等.这个时候如何避免将大量的请求同时发送到业务系统. 第一种方法:在容器中配置最大请求数,如果大于改请求数,则客户端阻塞.该方 ...

  7. fetch 请求详解

    转载:前后端数据交互(四)--fetch 请求详解 - 前端人 - 博客园 fetch 是 XMLHttpRequest 的升级版,使用js脚本发出网络请求,但是与 XMLHttpRequest 不同 ...

  8. java测试类 main方法_Java使用agent实现main方法之前的实例详解

    Java使用agent实现main方法之前的实例详解 创建Agent项目 PreMainExecutor 类,在main方法之前执行此方法 public class PreMainExecutor { ...

  9. Android JNI使用方法,JNI机制详解

    Android JNI使用方法,JNI机制详解 JNI的出现使得开发者既可以利用Java语言跨平台.类库丰 富.开发便捷等特点,又可以利用Native语言的高效. JNI是JVM实现中的一部分,因此N ...

最新文章

  1. protobuf的ParseFromArray 解析失败的问题
  2. python里的关键字有哪些_Python中的yield关键字做了什么?
  3. ORACLE 11G 搭建dataguard详细步骤(所有操作总结)
  4. 通过QuartzCore/CoreAnimation.h实现让玫瑰花飞舞
  5. 哪些名人在学python_盘点计算机界十位顶级人物,看看你认识几个?
  6. mysql密码输入多次都不对_mysql 密码不对
  7. Windows 11正式发布!网友的这波吐槽,太搞笑了。。。
  8. matlab 线性拟合(好像也可以由两点得出直线)
  9. c语言小组作业报告,C语言实训总结报告范文
  10. 计算机买什么固态硬盘,固态硬盘买什么接口好?那么多接口到底选哪种?看完这个秒懂...
  11. java计算机毕业设计高校疫情管理源程序+mysql+系统+lw文档+远程调试
  12. python 实现excel单元格合并和导出
  13. UNI-APP_HbuilderX打包出错,本次打包选择了通讯录权限,请完成实名认证后再继续打包,取消通讯录权限打钩,还是提示使用通讯录权限需要实名制
  14. IIC方式读驱动AT24C16芯片
  15. Nginx 上搭建PHP站 更改目录出现的错误:File not found、403 forbidden (13: Permission denied)
  16. python通过qq邮箱发邮件
  17. JavaScript-事件和事件对象、实现键盘打字小游戏
  18. 网络攻击与防御——对局域网的攻击
  19. 学习 Go 语言(Golang)读书笔记
  20. 卡巴斯基6.0企业版如何变更管理服务器

热门文章

  1. vue+flvjs实现自定义控制条的流媒体播放器
  2. AutoML在计算机视觉领域的能与不能
  3. 在线商城 php jsp,基于ssh/jsp/java/asp.net/php的鲜果商城管理系统
  4. python的opencv操作记录(五) - 插值第一篇
  5. 如何用Git命令删除远程分支
  6. 2023年东南大学考研934电路141分经验分享(附浙江工业大学调剂指南)
  7. 快慢指针和链表原地反转
  8. 关系型数据库 多对多(many to many)关系 三表还是两表
  9. android中edittext属性,Android中EditText的inputType属性的详解
  10. Android 实现压缩图片到任意尺寸