分叉PHP代码的一部分

时间:2011-11-30 22:09:56

标签: php multithreading curl fork

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

如果我可以分享脚本的特定部分,是否有任何想法?

或任何其他设计理念......?

4 个答案:

答案 0 :(得分:2)

以下是一些想法:

  • 使用curl_multi,并在请求的最后关闭curl。你甚至可以在“关机后”
  • 这样做
  • 使用工作人员脚本,例如'gearman'

或者:

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

答案 1 :(得分:1)

您是否需要cURL请求的回复?

首先,你需要fork的pcntl函数通常是一个坏主意。

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

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

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

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

答案 2 :(得分:0)

看看curl-multi-exec,可能就是您所需要的:

答案 3 :(得分:0)

PHP不支持forks和线程,但您可以通过设置响应超时来消除响应:

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);
}

取自:How to post an asynchronous HTTP request in PHP

作为CURL documentation,您可以使用自PHP 5.2.3和CURL 7.16.2以来的CURLOPT_TIMEOUT_MS