fork一部分php代码


Forking a part of the php code

在我的代码中,我使用curl_exec向另一个页面发送请求。对于脚本的其余部分,我不需要curl_exec结果,并且我不希望它阻塞,直到curl_exec请求完成并收到响应。

如果我可以fork脚本的特定部分,有什么想法吗?

或者其他的设计想法…?

以下是一些想法:

  • 使用curl_multi,并在请求的最后关闭curl。你甚至可以这样做'after shutdown'
  • 使用worker脚本,例如'gearman'

或:

  • 您可以手动打开套接字,并使用libevent扩展名异步处理内容

您需要cURL请求的响应吗?

首先,需要派生的pcntl函数通常是个坏主意。

一种方法是将cURL代码放在一个单独的脚本中,并执行()该脚本,使其在后台运行。

$command = "php ..../wherever/your/kohana/cli/controller/is.php";
exec('php /path/to/curlscript.php > /dev/null &');

输出到/dev/null &允许脚本在后台继续运行。

另一种可能更好的解决方案是实现一个队列系统,如Gearman或RabbitMQ。

看一下curl-multi-exec,可能是您需要的:

PHP不支持fork和thread,但是您可以通过设置响应超时来消除响应:

function curl_post_async($url, $params)
{
  foreach ($params as $key => &$val) {
    if (is_array($val)) $val = implode(',', $val);
      $post_params[] = $key.'='.urlencode($val);
  }
  $post_string = implode('&', $post_params);
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_USERAGENT, 'curl');
  curl_setopt($ch, CURLOPT_TIMEOUT, 1);
  $result = curl_exec($ch);
  curl_close($ch);
}

摘自:如何在PHP中发布异步HTTP请求

作为CURL文档,您可以使用CURLOPT_TIMEOUT_MS从PHP 5.2.3和CURL 7.16.2。