卷曲多线程与PHP(cURL Multi Threading with PHP)

2019-06-28 07:23发布

我使用的卷曲得到一些级别的数据,我已经得到存储在数据库中超过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分钟内全部时间。

Answer 1:

这一个永远没有工作对我来说... https://github.com/petewarden/ParallelCurl



Answer 2:

上述接受的答案是过时的,因此,正确答案是upvoted。

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

现在,PHP支持同时读取多个网址。

有某人写的很不错的功能, http://archevery.blogspot.in/2013/07/php-curl-multi-threading.html

你可以使用它。



Answer 3:

https://github.com/krakjoe/pthreads

您可以在PHP线程,所描绘的代码是太可怕线程编程,我不建议这是你如何做到这一点,但想告诉你20000个线程的开销......这是18秒时,在我目前的硬件哪个是英特尔G620(双核)与RAM的8gigs,在服务器硬件上,你可以期望更快的结果...你怎么线程这样的任务是依赖于你的资源,你所请求的服务的资源...



Answer 4:

你应该在你的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选项,为某些浏览器或分别对一些页面内容类型有条件地禁用它。



文章来源: cURL Multi Threading with PHP
标签: php curl nginx