`
icheng
  • 浏览: 882334 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
文章分类
社区版块
存档分类
最新评论

php中curl的多线程

 
阅读更多
许多人对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's a quick and dirty example for curl-multi from PHP, tested on PHP 5.0.0RC1 CLI / FreeBSD 5.2.1
*/

$connomains = array(
"http://www.cnn.com/",
"http://www.canada.com/",
"http://www.yahoo.com/"
);

$mh = curl_multi_init();

foreach ($connomains as $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 ($connomains as $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 ($active and $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]);
分享到:
评论

相关推荐

    CURL多线程类库

    总的来说,CURL多线程类库是PHP开发中的一个强大工具,它结合了CURL的功能强大和多线程的高效执行,为处理大量网络请求提供了有效解决方案。通过深入理解和实践提供的示例,开发者可以更好地利用这个库来提升其项目...

    php curl 多线程实现-php程序员的笔记

    php curl 多线程实现-php程序员的笔记

    php的curl多线程采集.zip

    在标题为"php的curl多线程采集.zip"的文件中,我们讨论的是如何利用PHP的cURL库进行多线程数据采集,这在大数据抓取、网页爬虫或自动化测试场景中非常有用。 首先,我们需要了解什么是多线程。在计算机科学中,多...

    php利用curl实现多线程类.zip

    本文将深入探讨如何在PHP中利用curl创建多线程类,以提升程序的性能。 首先,我们要理解curl在PHP中的作用。cURL是客户端URL处理库,它允许PHP程序发送HTTP请求,并处理各种协议(如HTTP、FTP、SMTP等)的响应。在...

    php的curl多线程采集

    ### PHP中的cURL多线程采集原理 1. **多会话并发**:`cURL`支持同时开启多个会话(`multi handle`),每个会话可以处理一个URL的请求。通过`curl_multi_init()`函数创建一个多会话管理器,然后为每个URL创建单独的`...

    CurlMulti 一个php多线程类库

    CurlMulti是PHP中用于处理HTTP请求的多线程库,尤其在进行批量数据抓取或需要并发执行多个HTTP操作时非常有用。它基于libcurl库,提供了对curl_multi_init(), curl_multi_add_handle(), curl_multi_exec(), 和curl_...

    利用curl 多线程 模拟 并发的详解

    在深入了解之前,首先需要了解PHP中curl多线程函数的基本用法。 在PHP中,处理HTTP请求的curl扩展提供了一系列多线程相关的函数,它们是: - curl_multi_init():初始化多线程curl句柄。 - curl_multi_close():...

    php利用curl实现多线程下载图片类.zip

    通过WEB服务器来实现PHP多线程功能,当然,对多线程有深入理解的人都知道通过WEB服务器实现的多...利用curl实现多线程下载图片类,其实是php利用curl实现的一个多线程类,有了这个类,我们也可利用该类执行多线程任务了。

    php利用curl实现多线程下载图片类

    通过WEB服务器来实现PHP多线程功能,当然,对多线程有深入理解的人都知道通过WEB服务器实现的多...利用curl实现多线程下载图片类,其实是php利用curl实现的一个多线程类,有了这个类,我们也可利用该类执行多线程任务了。

    php中curl模拟并发经典多线程

    这是一个经典的curl模拟多线程操作,缺点是总耗费时间取决于最慢的一个响应,网上有很多,只是用代码实现了一下,这是一个获取搜狗rank的示例

    PHP 利用Curl实现多线程抓取网页和下载文件

    本文将探讨如何利用PHP中的cURL库实现多线程抓取网页内容和下载文件,这是构建高效网络爬虫和数据抓取系统的关键技术。通过多线程,我们可以并行处理多个任务,显著提高工作效率。 首先,cURL是PHP的一个扩展,它...

    PHP Curl多线程原理实例详解

    以下是一个简单的Curl多线程实例: ```php // 初始化两个Curl句柄 $ch1 = curl_init(); $ch2 = curl_init(); // 设置URL和选项 curl_setopt($ch1, CURLOPT_URL, "http://www.example1.com/"); curl_setopt($ch1, ...

    IDENTITY完成用户注册认证,PHPCURL多线程GETPOST类.pdf

    2. PHPCURL多线程GET/POST类: PHP是一种广泛使用的开源服务器端脚本语言,而cURL是一个强大的命令行工具,用于发送和接收数据。在PHP中,cURL模块允许开发者使用cURL库在PHP脚本中发送HTTP请求。多线程是指同时执行...

    PHP多线程图片处理

    在PHP中实现多线程处理图片是一项挑战,因为PHP本身并不支持原生的多线程。但是,通过一些技巧和扩展,我们可以模拟实现多线程的功能。本篇将深入探讨如何利用CURL扩展来实现这一目标,以及在这个过程中可能遇到的...

    php结合curl实现多线程抓取

    在PHP中,我们可以利用cURL库来实现多线程数据抓取,这在处理大量网页数据或者需要同时从多个来源获取信息时非常有用。本文将详细介绍如何使用PHP结合cURL进行多线程抓取。 首先,cURL是一个客户端URL传输库,支持...

    php多线程类库.zip

    在PHP编程中,多线程通常不是其原生支持的功能,因为PHP主要设计为服务器端的脚本语言,主要用于处理单个请求。然而,随着Web应用程序复杂性的增加,开发人员有时候需要并行处理多个任务来提高效率。在这种情况下,...

    PHP使用CURL_MULTI实现多线程采集的例子

    在PHP开发中,为了提高网页数据采集的效率,可以利用cURL库提供的CURL_MULTI功能来实现多线程采集。CURL_MULTI接口允许同时处理多个cURL会话,从而达到并发访问HTTP资源的效果,这对于需要从多个源获取数据或者大量...

Global site tag (gtag.js) - Google Analytics