分叉php代码的一部分

分叉php代码的一部分,php,multithreading,curl,fork,Php,Multithreading,Curl,Fork,在我的代码中,我使用curl\u exec向另一个页面发送请求。我不需要脚本其余部分的curl\u exec结果,我也不希望在curl\u exec请求完成并收到响应之前阻止它 如果我能分出剧本的某个特定部分,有什么想法吗 或者任何其他设计想法…?以下是一些想法: 使用curl_multi,并在请求的最后关闭curl。你甚至可以在“关机后”这样做 使用辅助脚本,例如“gearman” 或: 您可以手动打开套接字,并使用libevent扩展异步处理内容 看看,这可能是您需要的:PHP不支持f

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

如果我能分出剧本的某个特定部分,有什么想法吗

或者任何其他设计想法…?

以下是一些想法:

  • 使用curl_multi,并在请求的最后关闭curl。你甚至可以在“关机后”这样做
  • 使用辅助脚本,例如“gearman”
或:

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

看看,这可能是您需要的:

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

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);
}
摘自:


作为,您可以使用
CURLOPT\u TIMEOUT\u MS
,因为PHP5.2.3和CURL 7.16.2。您需要CURL请求的响应吗

首先,您需要fork的pcntl函数通常不是一个好主意

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

$command = "php ..../wherever/your/kohana/cli/controller/is.php";
exec('php /path/to/curlscript.php > /dev/null &');
输出到/dev/null&允许脚本在后台继续运行。


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

这仍然会阻塞至少一秒钟听起来是个好主意。我的问题是,当我在不使用&的情况下从命令行执行时,脚本工作正常。但是当添加时&它失败了。有什么想法吗?
&
告诉终端不要等待响应。至于为什么它不起作用。。。好问题。您是否有权访问终端,以便在PHP之外进行尝试?另外,如果这是经常要执行的操作,例如,因为有一个面向公众的页面,在这种情况下,你最好实现一个队列系统。是的,我是从控制台执行的,我也遇到了同样的问题。我用“php test.php>log.txt”实现了一个简单的脚本,效果很好。剧本只回了一声“你好”;。当我添加&时,我没有得到任何log.txt。奇怪的是,我实际上想做的是推送谷歌安卓C2DM服务器,这需要几秒钟的时间。是的,我可以做一个队列脚本,但首先我会选择快速选项……如果您无法找到&symbol(后台运行进程)不起作用的原因,在谷歌搜索之后,可能值得就此提出一个问题。我不知道为什么它不起作用。对不起,我帮不了你。