如何让Curl_Multi_Exec返回超过20个不错的请求,而不会有500个错误代码

时间:2018-02-20 17:25:48

标签: php curl zend-framework curl-multi

我目前正在创建一个脚本,该脚本会将大量网址发送到Google Pagespeed Insights API(每100秒指定100个用户),处理返回的信息,并添加分数到我的数据库表。

当我尝试使用Curl_multi_exec发送超过20个时,我的问题出现了,因为超过此数量的任何数量的请求将发回500个错误响应,因此只有20个带有信息的良好请求(400个代码响应)。

我相信我远远低于我允许使用此API一次处理的内容。我已经尝试修改我的php.ini'max_file_uploads'字段,使其大于20;但是,这并没有解决这个问题。

我的代码如下:

    $results = array();

    $pagespeedInsightsUrls = new PagespeedInsightsUrls();
    $pagespeedUris = $pagespeedInsightsUrls->getPagespeedInsightsUrls();

   $cSession = curl_multi_init();

   for($i = 0; $i <= 29; $i++ ) {

    $curly[$i] = curl_init();

    $pagespeedURL = $googlePagespeedURL .$domains['common']. $pagespeedUris[$i]['pagespeed_urls'] . $strategy[0] . $apiKeys['TEST'];
    curl_setopt($curly[$i], CURLOPT_URL, $pagespeedURL);
    curl_setopt($curly[$i], CURLOPT_RETURNTRANSFER, true);

    curl_multi_add_handle($cSession, $curly[$i]);
   }
   $running = null;

   do {
      curl_multi_exec($cSession, $running); 
   } while($running > 0);

   foreach($curly as $i => $c) {
      $results[$i] = curl_multi_getcontent($c); 
      curl_multi_remove_handle($cSession, $c);
   }

   curl_multi_close($cSession);

有了这个,我将在20个“好”请求中收到10 500个代码。这是一个在Zend_framework环境中运行的脚本。

有人知道从哪里开始寻找解决方案吗? Curl_Multi的文档严重缺乏。

1 个答案:

答案 0 :(得分:0)

似乎Google的API服务器限制为同时连接20个。在您的末端,Curl并不是通过在单个连接上进行多路复用而是通过在其自己的连接中执行每个并为每个请求建立连接来实现这些并发请求。 HTTP服务器拒绝每个IP少数几个并发连接是很正常的,尽管在这种情况下,Google似乎已经在HTTP服务器级别实现了限制,因为它接受了连接但返回了500错误。

对并发连接数的任何限制是对每天或每100秒的最大请求数的单独限制。

根据their site,每个视图的每次并发请求不应超过10个。如果您的年龄是20岁,则说明Google接受的容忍度要比他们声明的要宽容,或者您​​的代码正在针对两种不同的视图或其他原因发送请求。