11

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

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

数组 $competeRequests 是 20,000 个对网站排名的competition.com api 的请求。

这是一个示例请求: 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

4 回答 4

14

上述接受的答案已过时,因此必须对正确答案进行投票。

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

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

于 2016-05-19T12:10:19.923 回答
8

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

于 2012-10-03T18:44:59.563 回答
5

https://github.com/krakjoe/pthreads

在此处输入图像描述

您可以使用 PHP 进行线程化,所描述的代码只是可怕的线程编程,我不建议您这样做,但想向您展示 20,000 个线程的开销......这是 18 秒,在我目前的硬件上是具有 8gigs 内存的 Intel G620(双核),在服务器硬件上,您可以期待更快的结果......如何处理这样的任务取决于您的资源,以及您请求的服务的资源......

于 2012-09-13T18:55:56.787 回答
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 可能正在执行的所有缓存,使您的输出在脚本运行时显示在浏览器上。

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

nginx的更新:

所以 OP 正在使用 nginx,这让事情变得有点棘手,因为 nginx 不允许从 PHP 禁用 gzip 压缩。我也使用 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。

于 2012-09-12T18:27:48.317 回答