Limite de taxa de solicitações PHP + curl de saída

Existe uma maneira de avaliar o limite (com atraso) de solicitações de PHP + curl de saída para um servidor externo, de modo que existam apenas n solicitações por segundo? O PHP é usado no modo Fastcgi, portanto, não é possível usar o modo de suspensão.

Sim. Há o curling multi handler …

(Você pode fazê-lo de uma forma OOP usando esta biblioteca )

Por exemplo:

// Creates the curl multi handle $mh = curl_multi_init(); $handles = array(); foreach($urls as $url) { // Create a new single curl handle $ch = curl_init(); // Set options curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 300); // Add to the multi handle curl_multi_add_handle($mh,$ch); // Put the handles in an array to loop this later on $handles[] = $ch; } // Execute the multi handle $running=null; do { $mrc = curl_multi_exec($mh,$running); // Added a usleep for 0.50 seconds to reduce load usleep (250000); } while($running > 0); // Get the content of the urls (if there is any) $output = array(); for($i=0; $i 

Você pode controlar a taxa com o algoritmo do balde token . Como você deseja controlar a taxa de todos os seus processos PHP para um recurso, você precisará compartilhar o estado do balde. Você pode fazer isso de uma maneira de thread com minha implementação: balde de largura de banda / token-balde

 use bandwidthThrottle\tokenBucket\Rate; use bandwidthThrottle\tokenBucket\TokenBucket; use bandwidthThrottle\tokenBucket\BlockingConsumer; use bandwidthThrottle\tokenBucket\storage\FileStorage; $storage = new FileStorage(__DIR__ . "/api.bucket"); $rate = new Rate(10, Rate::SECOND); $bucket = new TokenBucket(10, $rate, $storage); $consumer = new BlockingConsumer($bucket); $bucket->bootstrap(10); // This blocks all processes to the rate of 10 requests/second $consumer->consume(1); $api->doSomething();