Php 菲尔斯塔克useTube()->;put()函数,don';不要等待回应

Php 菲尔斯塔克useTube()->;put()函数,don';不要等待回应,php,asynchronous,pheanstalk,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(

我目前有以下情况:

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

要防止阻塞,必须分叉进程

$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返回。但请注意,还有一些其他问题:

  • 如果菲斯塔克再也没有回来呢?您的子进程将变成僵尸
  • 分叉流程包括复制大量流程变量。这并非没有开销,因此可能不一定会减少您的负载。如果你事后所做的一切都是真正的工作,那么这可能是值得的
理论上,您可以将消息传递给本地队列系统,该系统位于同一个盒子上,其任务是将消息发送到远程系统。这将使您获得相当快的响应,但可能需要您编写更多的代码。但是,如果您已经有一个本地beanstalk实例,那么这不会有任何帮助。(我怀疑您没有;本地呼叫beanstalk的速度很快。如果您有本地呼叫,则问题可能出在工作者/消费者端。)