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返回。但请注意,还有一些其他问题:
- 如果菲斯塔克再也没有回来呢?您的子进程将变成僵尸
- 分叉流程包括复制大量流程变量。这并非没有开销,因此可能不一定会减少您的负载。如果你事后所做的一切都是真正的工作,那么这可能是值得的李>