2

我正在处理 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'");

此实现不起作用,给我错误“一般错误:mysql 服务器已消失”。这是因为孩子们失去了联系。这似乎是 php 中 fork 本身的一个缺陷。

我的问题是有更好的解决方案来锁定这个进程直到它完成然后释放它以供其他 shell 脚本执行?

4

1 回答 1

1

我找到了确保程序不会调用和执行自身实例的最佳解决方案。我将在 php 中使用信号量来锁定程序。

这是一个关于信号量的简短教程: http ://www.re-cycledair.com/php-dark-arts-semaphores

于 2012-10-05T15:53:38.150 回答