我使用的卷曲得到一些级别的数据,我已经得到存储在数据库中超过20,000个域名。
我正在使用的代码是http://semlabs.co.uk/journal/object-oriented-curl-class-with-multi-threading 。
数组$ competeRequests为20000请求compete.com API的网站行列。
这是一个例子请求: http://apps.compete.com/sites/stackoverflow.com/trended/rank/?apikey=xxxx&start_date=201207&end_date=201208&jsonp= “;
由于有这些请求我想,所以我用下面的代码来完成,要打破他们成大块20000:
foreach(array_chunk($competeRequests, 1000) as $requests) {
foreach($requests as $request) {
$curl->addSession( $request, $opts );
}
}
这个伟大的工程在1000批次发送请求但剧本花费太长时间来执行。 我已经增加了的max_execution_time超过10分钟。
有没有办法从我的阵列发送1,000个请求然后解析结果,然后输出状态更新,然后用接下来的1000继续下去,直到数组是空的? 截至目前屏幕只是停留白色在脚本执行它可以在10分钟内全部时间。
这一个永远没有工作对我来说... https://github.com/petewarden/ParallelCurl
上述接受的答案是过时的,因此,正确答案是upvoted。
http://php.net/manual/en/function.curl-multi-init.php
现在,PHP支持同时读取多个网址。
有某人写的很不错的功能, http://archevery.blogspot.in/2013/07/php-curl-multi-threading.html
你可以使用它。
https://github.com/krakjoe/pthreads
您可以在PHP线程,所描绘的代码是太可怕线程编程,我不建议这是你如何做到这一点,但想告诉你20000个线程的开销......这是18秒时,在我目前的硬件哪个是英特尔G620(双核)与RAM的8gigs,在服务器硬件上,你可以期望更快的结果...你怎么线程这样的任务是依赖于你的资源,你所请求的服务的资源...
你应该在你的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可以做,使您的输出可以在脚本运行时在浏览器上显示出来。
注意注释掉apache_setenv
如果你使用nginx的Web服务器,而不是Apache的产品线。
更新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选项,为某些浏览器或分别对一些页面内容类型有条件地禁用它。