3

所以我有这个功能来发出非阻塞的 curl 请求。它适用于我迄今为止测试的内容(少量请求)。但我需要它来扩展数千个请求(可能最多 10,000 个)。我的问题是我不想遇到同时运行太多并行请求的问题。

您会建议对请求进行速率限制吗?睡了吗?批量申请?功能如下:

function poly_curl($requests){

            $queue = curl_multi_init(); 
            $curl_array = array(); 
            $count = 0;
            foreach($requests as $request) 
            { 
                $curl_array[$count] = curl_init($request); 
                curl_setopt($curl_array[$count], CURLOPT_RETURNTRANSFER, true); 
                curl_multi_add_handle($queue, $curl_array[$count]); 
                $count++;
            } 

            $running = NULL; 
            do { 

               curl_multi_exec($queue,$running); 

            } while($running > 0); 

            $res = array(); 
            $count = 0;
            foreach($requests as $request) 
            { 
                $res[$count] = curl_multi_getcontent($curl_array[$count]); 
                $count++;
            } 

            $count = 0;
            foreach($requests as $request){ 
                curl_multi_remove_handle($queue, $curl_array[$count]); 
                $count++;
            } 
            curl_multi_close($queue);        
            return $res; 
    }
4

4 回答 4

2

我认为curl_multi_exec这个目的是不好的,因为即使您使用 100 个为一组的批次,99 个请求也可能完成,并且仍然必须等待最后一个请求完成。

但是您需要 100 个并行请求,当一个请求完成时,另一个请求会立即启动。所以你根本无法使用curl_multi_exec

我会使用具有多个(恒定数量)消费者的普通生产者-消费者算法,每个消费者只处理一个 url。例如php-resqueCOUNT=100 php resque.php

于 2012-10-06T13:07:01.020 回答
1

您可能想要实现称为指数退避(维基百科)的东西。

基本上,它是一种算法,允许您根据一些反馈动态扩展您的流程。

您在应用程序中定义一个速率,并且在第一次超时、错误或任何您决定的情况下,您会降低该速率,直到请求完成。

例如,您可以使用 HTTP 响应代码轻松实现它。

于 2012-10-06T12:38:10.247 回答
0

上次我做这样的事情包括下载和“解析”文件。一次只能处理 4 个子页面,受限于非常弱的硬件处理器(具有 HT 的 2 个内核)。我什么时候结束了两个队列:1 等待,2 进行中。每次从第二个队列中删除任务时,都会从第一个队列中取出新任务。

可能听起来很复杂,但在彼此和简单count()的两个循环中结束

顺便说一句,考虑到如此高的速率,我会考虑使用 Node.js - 为简单起见 - 或任何比 PHP 更非阻塞且更适合守护程序的东西。只要线程是 PHP 的弱点,它就不适合那里。

PS:很好的和有用的代码,谢谢。

于 2015-06-19T11:09:33.237 回答
0

我们曾经在 C++ 连接池代码中遇到过同样的问题。该方法是那些日子涉及一些严肃的分析。

但是,本质是,我们创建了一个池,请求将根据可用请求的数量得到处理。我们还做的是分配最大数量的连接池。[这是通过测试确定的]。

您真正需要的是一种方法来确定正在处理的请求数量并对其进行限制。在你的情况下是 $count

只需将 $count 与最大值[例如,$max] 进行比较,然后停在那里。根据程序运行的系统定义值。$max 可以是硬编码的或动态的。

于 2015-12-11T14:23:59.630 回答