【发布时间】:2014-07-19 12:42:13
【问题描述】:
我正在尝试创建一个在后台运行并派生子进程的 PHP 脚本。 (我知道这可能会导致服务器爆炸;有超出此问题范围的额外保护措施)
简而言之,代码是这样工作的:
$pids = array();
$ok = true;
while ($ok)
{
$job = $pheanstalk->watch('jobs')->ignore('default')->reserve();
echo 'Reserved job #' . $job->getId();
$pids[$job->getId()] = pcntl_fork();
if(!$pids[$job->getId()]) {
doStuff();
$pheanstalk->delete($job);
exit();
}
}
问题是,一旦我 fork 进程,我就会得到错误:
Reserved job #0
PHP Fatal error: Uncaught exception 'Pheanstalk_Exception_ServerException' with message 'Cannot delete job 0: NOT_FOUND'
我的问题是,pheanstalk 是如何返回一个没有 ID 和有效负载的作业的?一旦我 fork 它几乎感觉就像 $pheanstalk 损坏了。如果我删除分叉,一切正常。 (虽然它必须等待每个进程)
【问题讨论】:
-
首先,在fork之后再放一个if条件:(if $pids[$job->getId()]==-1) die('fork failed!');。因为你的 fork() 很有可能还没有成功!
标签: php fork pheanstalk