PHP中的非阻塞卷曲请求

时间:2012-10-06 12:21:59

标签: php http curl nonblocking

所以我有这个功能来进行非阻塞卷曲请求。它在我到目前为止测试的内容(少量请求)上工作正常。但我需要将其扩展到数千个请求(可能最多10,000个)。我的问题是我不想遇到同时运行太多并行请求的问题。

您建议对请求进行速率限制? Usleep?批量请求?功能如下:

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 个答案:

答案 0 :(得分:2)

我认为curl_multi_exec不利于此目的,因为即使您使用100个组中的批次,也可以完成99个请求,但仍需要等待上次请求完成。

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

我会使用普通的生产者 - 消费者算法和多个(常数)消费者,每个消费者只处理一个网址。例如php-resqueCOUNT=100 php resque.php

答案 1 :(得分:1)

您可能希望实现一种称为指数退避(wikipedia)的内容。

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

您可以在应用程序中定义费率,并在第一次超时,错误或您决定的任何内容时,在请求完成之前降低此费率。

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

答案 2 :(得分:0)

上次我做这样的事情时,包括下载和解析"文件。能够在非常弱的硬件处理器(带有HT的2个核心)限制的时间内仅进行4个子页面。什么时候我最终得到两个队列:1代表等待,2代表正在进行中。每当一个任务从第二个队列中消失时,就会从第一个队列中获取新任务。

可能很复杂,但在另一个内部以两个循环结束并简单count()&#39>

Btw,考虑到这么高的比率,我会想到使用Node.js - 为了简单 - 或者更多的非阻塞,更适合于守护程序而不是PHP ..只要线程是PHP弱点,它就不适合那里。 / p>

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

答案 3 :(得分:0)

我们过去常常遇到与C ++连接池代码相同的问题。这种方法涉及到一些严肃的分析。

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

您真正需要的是一种方法,用于确定正在处理的请求数量并对其设置限制。在您的情况下是$ count

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