如何让Curl_Multi_Exec在没有500个错误代码的情况下返回超过20个良好请求

问题描述 投票:1回答:1

我目前正在创建一个脚本,该脚本会将大量网址发送到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的文档严重缺乏。

php curl zend-framework curl-multi
1个回答
0
投票

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

对同时连接数的任何限制都是对其每天或每100秒的最大请求数的单独限制。

根据their site的说法,每个视图不应超过10个并发请求。如果你得到20,那么谷歌对他们接受的内容比他们所说的更宽容,或者你的代码正在发送2个不同观点或其他原因的请求。

© www.soinside.com 2019 - 2024. All rights reserved.