我正在使用cURL来获取我存储在数据库中的超过20,000个域名的一些排名数据。
我使用的代码是http://semlabs.co.uk/journal/object-oriented-curl-class-with-multi-threading。
数组$ competRequests是针对网站排名的compet.com api的20,000请求。
由于这些请求中有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分钟。
答案 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
你可以在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_disable或gzip_types选项,有条件地禁用某些浏览器或某些页面内容类型的gzip。