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


pheanstalk useTube()->put() function, don't wait for response

我目前有以下内容:

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服务器部分响应的等待?

为了防止阻塞,你必须fork你的进程。

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

它的作用是fork你的进程,并让子进程等待直到pheanstalk返回。不过,请注意还有一些其他问题:

  • 如果pheanstalk再也没有回来怎么办?你的子进程变成僵尸。
  • fork一个进程包括复制很多进程变量。这并非没有开销,因此不一定会减少您的负载。如果你之后做的事情是真正的工作,那么这可能是值得的。
理论上,您可以将消息传递给同一盒子上的本地队列系统,该系统的工作是将消息传递给远程系统。这将使您获得相当快的响应,但可能需要编写更多代码。但是,如果您已经有了一个本地bean实例,那么这就没有用了。(我怀疑你不知道;对beanstalk的本地呼叫速度很快。如果你有一个本地的,问题可能是在工人/消费者端。