相信许多人对php手册中语焉不详的curl_multi一族的函数头疼不已,它们文档少,给的例子更是简单的让你无从借鉴,我也曾经找了许多网页,都没见一个完整的应用例子。
curl_multi_add_handle
curl_multi_close
curl_multi_exec
curl_multi_getcontent
curl_multi_info_read
curl_multi_init
curl_multi_remove_handle
curl_multi_select
一般来说,想到要用这些函数时,目的显然应该是要同时请求多个url,而不是一个一个依次请求,否则不如自己循环去调curl_exec好了。
步骤总结如下:
第一步:调用curl_multi_init
第二步:循环调用curl_multi_add_handle
这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle。
第三步:持续调用curl_multi_exec
第四步:根据需要循环调用curl_multi_getcontent获取结果
第五步:调用curl_multi_remove_handle,并为每个字handle调用curl_close
第六步:调用curl_multi_close
这里有一个网上找的简单例子,其作者称为dirty的例子,(稍后我会说明为何dirty):
/*
Here'saquickanddirtyexampleforcurl-multifromPHP,testedonPHP5.0.0RC1CLI/FreeBSD5.2.1
*/
$connomains=array(
"http://www.cnn.com/",
"http://www.canada.com/",
"http://www.yahoo.com/"
);
$mh=curl_multi_init();
foreach($connomainsas$i=>$url){
$conn[$i]=curl_init($url);
curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1);
curl_multi_add_handle($mh,$conn[$i]);
}
do{$n=curl_multi_exec($mh,$active);}while($active);
foreach($connomainsas$i=>$url){
$res[$i]=curl_multi_getcontent($conn[$i]);
curl_close($conn[$i]);
}
print_r($res);
整个使用过程差不多就是这样,但是,这个简单代码有个致命弱点,就是在do循环的那段,在整个url请求期间是个死循环,它会轻易导致CPU占用100%。
现在我们来改进它,这里要用到一个几乎没有任何文档的函数curl_multi_select了,虽然C的curl库对select有说明,但是,php里的接口和用法确与C中有不同。
把上面do的那段改成下面这样:
do{
$mrc=curl_multi_exec($mh,$active);
}while($mrc==CURLM_CALL_MULTI_PERFORM);
while($activeand$mrc==CURLM_OK){
if(curl_multi_select($mh)!=-1){
do{
$mrc=curl_multi_exec($mh,$active);
}while($mrc==CURLM_CALL_MULTI_PERFORM);
}
}
因为$active要等全部url数据接受完毕才变成false,所以这里用到了curl_multi_exec的返回值判断是否还有数据,当有数据的时候就不停调用curl_multi_exec,暂时没有数据就进入select阶段,新数据一来就可以被唤醒继续执行。这里的好处就是CPU的无谓消耗没有了。
另外:还有一些细节的地方可能有时候要遇到:
控制每一个请求的超时时间,在curl_multi_add_handle之前通过curl_setopt去做:
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
判断是否超时了或者其他错误,在curl_multi_getcontent之前用:curl_error($conn[$i]);
分享到:
相关推荐
标题:PHP中curl_multi系列函数的用法实例 PHP作为广泛使用的服务器端脚本语言,在进行网页开发时经常需要与外部资源进行数据交换,而cURL库正是提供了一种方法来完成这个任务。在PHP中,除了单个请求的cURL函数...
在PHP中,`curl_init()` 和 `curl_multi_init()` 是两个用于HTTP请求的重要函数,尤其在数据抓取和网络通信的场景中。`curl_init()` 是一个基础的CURL会话初始化函数,它用于创建一个新的CURL句柄,用于执行单一的...
在实际应用中,可以结合使用`curl_setopt()`设置其他选项,如设置HTTP头、添加cookies、处理重定向、验证SSL证书等。此外,还可以通过`curl_multi_info_read()`获取每个请求的详细信息,以便进行更复杂的错误处理和...
在PHP开发中,为了提高网页数据采集的效率,可以利用cURL库提供的CURL_MULTI功能来实现多线程采集。CURL_MULTI接口允许同时处理多个cURL会话,从而达到并发访问HTTP资源的效果,这对于需要从多个源获取数据或者大量...
在PHP中,`curl_multi` 是一个用于并发执行多个cURL请求的库,它能够显著提高批量处理HTTP请求的效率。传统的单个`curl`请求会阻塞程序,直到请求完成才会继续执行下一条,而`curl_multi`则允许同时处理多个请求,...
通过封装`curl_multi`,我们可以创建一个强大的工具,简化并行HTTP请求的处理,提高PHP应用的性能。在实际项目中,可以根据需求进一步扩展此类,比如增加超时控制、重试机制、请求优先级管理等功能。
在PHP中,`curl_multi` 是一组用于同时处理多个cURL连接的函数,极大地提高了并发请求的效率。然而,正如标题和描述所提及的,`curl_multi` 功能在某些特定版本的cURL库和PHP环境中可能存在兼容性问题,可能导致在你...
在PHP编程中,使用cURL库发送HTTP请求是常见的需求,而cURL的多线程请求能力则通过curl_multi系列函数实现。这些函数允许程序员同时处理多个URL的请求,比起顺序执行,使用curl_multi可以大大提高应用的响应速度和...
了解并掌握`curl_multi`的使用,能显著提升PHP应用的性能。此外,`curl_multi`还支持错误处理和回调函数,使得我们可以更精细地控制并发请求的流程,实现更复杂的功能。在实际项目中,可以根据需求对`CurlMultiUtil`...
CurlMulti是PHP中用于处理HTTP请求的多线程库,尤其在进行批量数据抓取或需要并发执行多个HTTP操作时非常有用。它基于libcurl库,提供了对curl_multi_init(), curl_multi_add_handle(), curl_multi_exec(), 和curl_...
在实际应用中,你可能还需要处理错误,例如检查cURL的错误码,并根据需要添加超时、重试机制,或者使用`CURLOPT_WRITEFUNCTION`回调函数处理响应数据。此外,对于POST请求,可以通过`curl_setopt()`设置`CURLOPT_...
cURL库本身是一个强大的客户端URL传输工具,而`php_curl`扩展则是将这些功能集成到PHP语言中,极大地拓宽了PHP在Web开发中的应用范围。 **一、libeay32.dll和ssleay32.dll** 在启用`php_curl`扩展时,两个重要的...
### PHP中CURL相关函数详解 #### 一、概述 CURL(Client URL)是PHP中用于处理HTTP请求的强大库之一,它支持多种协议(如HTTP、HTTPS、FTP等),并能够实现各种复杂的网络交互需求。本文将详细介绍PHP中与CURL相关...
在PHP中,CURL函数库(Client URL Library Function)是一个强大的工具,用于处理HTTP和其他协议的请求。这个库提供了一组丰富的函数,使得开发者能够轻松地进行网页抓取、文件上传下载、POST数据等网络操作。以下是...
总结来说,PHP的`cURL`批处理和并发功能通过`curl_multi_init()`、`curl_multi_add_handle()`、`curl_multi_exec()`等函数,提供了高效地处理多个网络请求的能力,是PHP开发中不可或缺的工具,尤其在大数据抓取、...
例如:<phpcurl_exec($ch);?> curl_close() 函数用于关闭一个 curls 会话,该函数接受一个参数,即 curls_init() 函数返回的句柄。例如:<phpcurl_close($ch);?> curl_version() 函数用于获取 curls 相关的版本...
总之,CURL是PHP中一个不可或缺的工具,它提供了丰富的功能来处理网络请求,无论是在简单的HTTP交互还是复杂的Web抓取场景中,都有其广泛的应用。理解并熟练运用CURL,将极大提升你的PHP编程能力。
通过使用`curl_multi_init()`初始化一个多路复用句柄,并将所有请求添加到这个句柄中,然后调用`curl_multi_exec()`来处理这些请求。这种方式可以显著降低总的响应时间,即使每个网站响应时间仍然是500毫秒左右,但...