PHP curl 并发最佳实践代码分享
在实际项目或者自己编写小工具
(比如新闻聚合,商品价格监控,比价)的过程中, 通常需要从
第
3 方网站或者 API 接口获取数据, 在需要处理 1 个 URL 队列时, 为了提高性能, 可以采用
cURL 提供的 curl_multi_*族函数实现简单的并发
本文将探讨两种具体的实现方法
, 并对不同的方法做简单的性能对比.
1. 经典 cURL 并发机制及其存在的问题
经典的
cURL 实现机制在网上很容易找到, 比如参考 PHP 在线手册的如下实现方式:
代码如下
:
function
classic_curl(
$urls
,
$delay
) {
$queue
= curl_multi_init();
$map
=
array
();
foreach
(
$urls
as
$url
) {
// create cURL resources
$ch
= curl_init();
// set URL and other appropriate options
curl_setopt(
$ch
, CURLOPT_URL,
$url
);
curl_setopt(
$ch
, CURLOPT_TIMEOUT, 1);
curl_setopt(
$ch
, CURLOPT_RETURNTRANSFER, 1);
curl_setopt(
$ch
, CURLOPT_HEADER, 0);
curl_setopt(
$ch
, CURLOPT_NOSIGNAL, true);
// add handle
curl_multi_add_handle(
$queue
,
$ch
);
$map
[
$url
] =
$ch
;
}
$active
= null;
// execute the handles
do
{
$mrc
= curl_multi_exec(
$queue
,
$active
);
}
while
(
$mrc
== CURLM_CALL_MULTI_PERFORM);
while
(
$active
> 0 &&
$mrc
== CURLM_OK) {