background image

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) {