使用 curl_multi_await 时为空响应

empty response when using curl_multi_await

我正在测试文档中 curl_multi_await 的示例(请参阅下面的代码),但我无法得到任何响应。 我正在使用 hhvm 的 3.8.1 版。

我遇到了 HH\Asio\curl_exec 的问题,但已通过更新 hhvm 解决,是否相关?

<?hh
  async function curl_exec_await(string $url): Awaitable<string> {
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

  $mh = curl_multi_init();
  curl_multi_add_handle($mh, $ch);
  do {
    $active = 1;
    do {
      $status = curl_multi_exec($mh, $active);
    } while ($status == CURLM_CALL_MULTI_PERFORM);
    $select = await curl_multi_await($mh);
    if ($select == -1) break;
  } while ($status === CURLM_OK);
  $content = (string)curl_multi_getcontent($ch);
  curl_multi_remove_handle($mh, $ch);
  curl_multi_close($mh);
  return $content;
}

var_dump(curl_exec_await('http://example.com')->getWaitHandle()->join());

此代码打印空字符串。

感谢您的帮助!

  • 文档中的函数(您已在此处复制)只是一个示例。它在 stdlib 中作为 \HH\Asio\curl_exec 可用,您可以直接使用它来代替您的 curl_exec_await。参见 the docs
  • 如果该功能仍然不起作用,您能否检查您的错误日志中是否有任何错误输出,并且file an issue on GitHub以便我们找出问题所在?在 SO 上跟踪问题比这里好得多。

这里是固定的例子,如果它可以帮助某人:

<?hh
  async function curl_exec_await(string $url): Awaitable<string> {
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

  $mh = curl_multi_init();
  curl_multi_add_handle($mh, $ch);

  $active = 0;
  do {
      $status = curl_multi_exec($mh, $active);
      await RescheduleWaitHandle::create(
          RescheduleWaitHandle::QUEUE_DEFAULT,
          0,
      );
  } while ($status == CURLM_CALL_MULTI_PERFORM || $active > 0);
  await curl_multi_await($mh);

  $content = (string)curl_multi_getcontent($ch);
  curl_multi_remove_handle($mh, $ch);
  curl_multi_close($mh);
  return $content;
}

var_dump(curl_exec_await('http://example.com')->getWaitHandle()->join());