`
feitu_jeff
  • 浏览: 44829 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

[转载]PHP Curl 多线程实现

    博客分类:
  • PHP
 
阅读更多

[转载] http://blog.sina.com.cn/s/blog_63940ce20100neyb.html
# 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]);

分享到:
评论

相关推荐

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

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

    CURL多线程类库

    使用这个CURL多线程类库,开发者可以实现批量下载、数据抓取、分布式爬虫等多种复杂场景,大大提高PHP处理网络请求的效率。需要注意的是,在实际应用中,应考虑服务器资源限制,合理设置线程数量,避免过度消耗内存...

    php的curl多线程采集.zip

    以下是一个基本的PHP多线程cURL采集的实现思路: 1. 创建一个自定义的线程类,继承自`Thread`类(如果你使用了`pthreads`扩展)。 2. 在这个自定义线程类中,定义一个使用cURL的`run`方法,用于执行HTTP请求。 3. ...

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

    在这种情况下,单线程的请求方式效率低下,而利用curl实现多线程可以显著提高处理速度。本文将深入探讨如何在PHP中利用curl创建多线程类,以提升程序的性能。 首先,我们要理解curl在PHP中的作用。cURL是客户端URL...

    curl线程池多线程调用

    在`curl`中,可以通过并行运行多个`curl`进程来实现多线程效果,每个进程负责一个独立的网络请求。 2. **线程池**:线程池是一种线程管理机制,它预先创建了一组线程,当有新的任务需要执行时,线程池会从已存在的...

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

    通过WEB服务器来实现PHP多线程功能,当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程。利用curl实现多线程下载图片类,其实是php利用curl实现的一个...

    php的curl多线程采集

    ### PHP多线程扩展 PHP默认不支持真正的多线程,但可以通过以下两种方式实现: 1. **pthreads扩展**:这是一个用户空间的线程实现,可以创建线程对象并实现同步机制。每个线程可以拥有自己的`cURL`会话,实现并行...

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

    通过WEB服务器来实现PHP多线程功能,当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程。利用curl实现多线程下载图片类,其实是php利用curl实现的一个...

    curl-7.37.0简单下载多线程下载断点续载范例_非常简洁

    在提供的 `curl-7.37.0` 压缩包中,包含了 `curl` 的完整源代码,开发者可以通过阅读源码理解其内部实现,如如何处理多线程、断点续载等机制。这有助于深入学习网络编程、HTTP 协议等相关知识。 ### 6. 示例代码 ...

    CurlMulti 一个php多线程类库

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

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

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

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

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

    php结合curl实现多线程抓取

    以下是一个简单的PHP多线程cURL抓取示例: ```php <?php function Curl_http($array, $timeout) { $res = array(); $mh = curl_multi_init(); // 创建多个curl语柄 $startime = getmicrotime(); // 初始化每个...

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

    在PHP中,我们可以利用`curl`的多线程功能来实现并发请求,提高效率,避免逐个请求的耗时。本文将详细讲解如何利用`curl`的多线程功能模拟并发。 首先,我们需要了解PHP中的`curl`多线程函数: 1. `curl_multi_...

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

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

    php使用curl模拟多线程实现批处理功能示例

    本文实例讲述了php使用curl模拟多线程实现批处理功能。分享给大家供大家参考,具体如下: php模拟多线程用到curl库,这个库很强大,可以做好多事,比如模拟登陆,文件上传/下载,数据采集等。 下面是我的代码,很简单...

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

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

    PHP Curl多线程原理实例详解

    首先,Curl多线程(或多路复用)是通过`curl_multi_*`系列函数实现的,这些函数允许开发者并发地执行多个HTTP请求,而不是顺序执行。这种并行处理提高了程序效率,尤其是在处理大量网络请求时。 核心的`curl_multi_...

Global site tag (gtag.js) - Google Analytics