我正在尝试使用内置的共享内存函数在 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 脚本的多个实例相互堆积,同时考虑脚本设置信号量并在它有机会清除它之前就死掉的情况.
非常感谢!