pheanstalk useTube() - > put()函数,不要等待响应

时间:2013-03-15 21:26:31

标签: php asynchronous pheanstalk

我目前有以下内容:

try {
    $pheanstalk->useTube($tube)->put($data);
} catch (\Exception $e) {
    $logger = $this->container->get('logger');
    $logger->info('Could not reach beanstalk: ' . $e);
}

这样可以正常工作,但是我希望$pheanstalk->useTube($tube)->put($data)不等待来自服务器的连接响应,并且只是尝试将数据放入队列然后继续其快活办法。该服务存储的数据很好,但并不重要。因此,在繁重的加载时间期间,我希望不必等待超时时间,然后才能继续执行程序的其余部分。如何消除pheanstalk服务器部分的响应等待?

1 个答案:

答案 0 :(得分:0)

为防止阻止,您必须分叉您的流程。

$pid = pcntl_fork();
if ($pid == -1) {
     die('could not fork');
} else if ($pid) {
     // we are the parent
     // proceed with whatever
} else {
     // we are the child
     $exitStatus = -1;
     try {
         $pheanstalk->useTube($tube)->put($data);
         $exitStatus = 1;
     } catch (\Exception $e) {
         $logger = $this->container->get('logger');
         $logger->info('Could not reach beanstalk: ' . $e);
         $exitStatus = 0;
     }

     exit($exitStatus); 
}

这样做是分叉您的进程并让子进程等待直到pheanstalk返回。请注意,还有一些其他问题:

  • 如果pheanstalk永远不会回来怎么办?你的孩子进程变成了僵尸。
  • 分叉流程包括复制大量流程变量。这不是没有开销,因此可能不一定会减少您的负载。如果你之后所做的一切都是真正的工作,那也许值得。

理论上,您可以在同一个框中将消息传递给本地排队系统,其作用是将消息放在远程系统上。这样可以获得非常快速的响应,但可能需要您进行更多编码。但是,如果您已经有一个本地beanstalk实例,那么这将无济于事。 (我怀疑你没有;本地调用beanstalk很快。如果你确实有本地调用,问题可能在于工人/消费者端。)