我正在使用cakephp中的shell脚本来处理mysql数据库中的项目队列。为了加快这个过程,我正在使用pcntlfork:
$pids = array();
$i = 0;
for($i = 0; $i < count($queue); $i++)
{
$pids[$i] = pcntl_fork();
if(!$pids[$i]) {
# do code
exit();
}
}
在执行此代码时,shell脚本可能会在当前脚本有时间从队列中删除项目之前运行。我正在使用mysql并像这样锁定表:
$this->Queue->query("SELECT GET_LOCK('".$this->mysqlLock."', ".$this->mysqlLockTime.") AS 'GetLock'");
这个实现不起作用给我错误&#34;一般错误:mysql服务器已经消失了#34;。这是因为孩子们的连接丢失了。它似乎是php中fork本身的一个缺陷。
我的问题是有一个更好的解决方案来锁定这个进程,直到它完成然后释放它以便其他shell脚本执行?
答案 0 :(得分:1)
我找到了最好的解决方案,以确保程序不会调用并执行自己的实例。我将在php中使用信号量来锁定程序。
这是一个关于信号量的简短教程: http://www.re-cycledair.com/php-dark-arts-semaphores