0

我正在尝试使用内置的共享内存函数在 PHP 中实现一个简单的非阻塞信号量。我的脚本基本上是这样的:

$key = ftok(__FILE__, 'A');

$shmId = shm_attach($key);
$runningKey = 37238383940234;

// die now if the script is already running
if (shm_has_var($shmId, $runningKey)) {
    echo "Another instance is running\n";
    exit;
}

// tell other instances that I'm running so that they die
shm_put_var($shmId, $runningKey, true);

sleep(20);

// drop shared memory key
shm_remove_var($shmId, $runningKey);

// terminate script
exit;

只要脚本正常开始和结束,这就会很好。但是,假设脚本在运行时意外死亡(在 shm_put_var() 之后,但在 shm_remove_var() 之前)。例如,进程被 control-C 杀死或发送 SIGTERM。我的测试表明,当脚本重新启动时,共享内存变量会保留现在死掉的实例设置的值。我能理解为什么会这样。但是,我正在寻找一种解决方法,或者可能是一些关于替代方法的建议。

我的目标是一个非阻塞信号量,它将防止同一 CLI 脚本的多个实例相互堆积,同时考虑脚本设置信号量并在它有机会清除它之前就死掉的情况.

非常感谢!

4

1 回答 1

2

既然您正在处理进程之间的锁(而不是在同一进程上运行的 PHP 请求),为什么不在虚拟文件(其路径将充当信号量键)上使用 flock() 呢?如果进程因任何原因死亡,操作系统会自动释放锁。

于 2013-08-13T23:27:51.100 回答