使用PHP进行cURL多线程处理

时间:2012-09-12 18:13:38

标签: php curl nginx

我正在使用cURL来获取我存储在数据库中的超过20,000个域名的一些排名数据。

我使用的代码是http://semlabs.co.uk/journal/object-oriented-curl-class-with-multi-threading

数组$ competRequests是针对网站排名的compet.com api的20,000请求。

这是一个示例请求:  http://apps.compete.com/sites/stackoverflow.com/trended/rank/?apikey=xxxx&start_date=201207&end_date=201208&jsonp=“;

由于这些请求中有20,000个我想将它们分解成块,所以我使用以下代码来实现这一点:

foreach(array_chunk($competeRequests, 1000) as $requests) {
    foreach($requests as $request) {
        $curl->addSession( $request, $opts );
    }

}

这适用于以1,000个批量发送请求,但脚本执行时间太长。我已将max_execution_time增加到10分钟以上。

有没有办法从我的阵列发送1,000个请求然后解析结果然后输出状态更新然后继续下一个1,000,直到数组为空?截至目前,在脚本执行的整个时间内屏幕只保持白色,可能超过10分钟。

4 个答案:

答案 0 :(得分:12)

以上接受的答案已经过时,因此,必须正确回答正确的答案。

http://php.net/manual/en/function.curl-multi-init.php

现在,PHP支持同时提取多个URL。

有人写的功能非常好, http://archevery.blogspot.in/2013/07/php-curl-multi-threading.html

你可以使用它。

答案 1 :(得分:9)

这个人总是为我做的工作...... https://github.com/petewarden/ParallelCurl

答案 2 :(得分:4)

https://github.com/krakjoe/pthreads

enter image description here

你可以在PHP中进行操作,所描述的代码只是可怕的线程编程,我不建议你是怎么做的,但是想向你展示20,000个线程的开销...这是18秒,在我身上当前的硬件是Intel G620(双核),带有8g的ram,在服务器硬件上你可以期待更快的结果......你如何线程化这样的任务取决于你的资源,以及你请求的服务的资源。 ..

答案 3 :(得分:2)

将它放在php脚本的顶部:

set_time_limit(0);
@apache_setenv('no-gzip', 1);//comment this out if you use nginx instead of apache
@ini_set('zlib.output_compression', 0);
@ini_set('implicit_flush', 1);
for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); }
ob_implicit_flush(1);

会禁用Web服务器或php可能正在执行的所有缓存,使得输出在脚本运行时显示在浏览器上。

如果使用nginx web服务器而不是apache,请注意注释掉apache_setenv行。

更新nginx:

所以OP正在使用nginx,这使得事情变得有点棘手,因为nginx不允许从PHP禁用gzip compresion。我也使用nginx,我发现我默认它处于活动状态,请参阅:

cat /etc/nginx/nginx.conf | grep gzip
    gzip on;
    gzip_disable "msie6";
    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

所以你需要在nginx.conf上禁用gzip并重新启动nginx:

/etc/init.d/nginx restart

或者您可以使用gzip_disablegzip_types选项,有条件地禁用某些浏览器或某些页面内容类型的gzip。