我目前有以下内容:
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一个进程包括复制很多进程变量。这并非没有开销,因此不一定会减少您的负载。如果你之后做的事情是真正的工作,那么这可能是值得的。