1

我的问题是我想从 API 网页访问 json 数据,并且每秒只允许 10 次调用。在向处理程序添加 10 次调用后,我执行它们,然后对每个结果进行解码,处理的数据和 curl 会话将从处理程序中删除。

平均而言,一次调用大约需要 600 毫秒(11600 次调用的结果)。我打了 10 后如何停止给新人打电话?我尝试使用 usleep (并且它有效),但它减慢了所有沉重的东西。有时大约 20 秒〜这是延迟 curl 调用的唯一方法还是如何更改此代码以提高效率?

$i = 0;
$run = NULL;
do {
  curl_multi_add_handle($handler, $curls[$i++]);
  while ($i < $curl_count && $i % 10 != 0) {
    curl_multi_add_handle($handler, $curls[$i++]);
  }
  curl_multi_exec($handler, $running);
  do {
    if (curl_multi_select($handler) != -1) {
      curl_multi_exec($handler, $running);
    }
  } while ($running > 0);

  while ($msg = curl_multi_info_read($handler)) {
    $exec_time[] = curl_getinfo($msg['handle'], CURLINFO_TOTAL_TIME);
    $response = curl_multi_getcontent($msg['handle']);
    $results = json_decode($response);
    processData() // function to process data
    curl_multi_remove_handle($handler, $msg['handle']);
  }
  $waiting_time = 1 - max($exec_time);
  if ($waiting_time > 0) {
    usleep(1000000 * $waiting_time);
  }
  $exec_time = NULL;
  usleep(100 * 1000);
} while ($i < count($curls));
curl_multi_close($handler);

编辑更新代码以解决错误并改进它。查看编辑以查看发生了什么变化。

4

1 回答 1

0

您可能需要设置一个计时器,并且只在达到 1 秒间隔所需的时间内睡眠,而不是硬编码的 1 秒时间。所以像:

// start loop here

$start_time = microtime();

// run your 10 cURL requests here

$end_time = microtime();
$udelay = 1000000 * (1 - ($end_time - $start_time));
if ($udelay > 0) {
    usleep($delay);
}

// end loop here

顺便说一句,这似乎是curl_multi. 如果你喜欢你可以看看我写的这个轻量级的基于 curl 的 REST 客户端。通过异常处理等,这将使您更加健壮。

https://github.com/mikecbrant/php-rest-client

于 2014-08-25T14:18:58.073 回答