我目前有以下内容:
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服务器部分的响应等待?
答案 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返回。请注意,还有一些其他问题:
理论上,您可以在同一个框中将消息传递给本地排队系统,其作用是将消息放在远程系统上。这样可以获得非常快速的响应,但可能需要您进行更多编码。但是,如果您已经有一个本地beanstalk实例,那么这将无济于事。 (我怀疑你没有;本地调用beanstalk很快。如果你确实有本地调用,问题可能在于工人/消费者端。)