PHP共享内存变量在脚本提前终止后仍然存在


PHP shared memory vars remain after script prematurely terminated

我正试图使用内置的共享内存函数在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_move_var(()之前)。例如,进程被control-C终止或发送一个SIGTERM。我的测试表明,当脚本重新启动时,共享内存变量会保留由现在已经失效的实例设置的值。我能理解为什么会这样。然而,我正在寻找一个变通方法,或者可能是关于另一种方法的一些建议。

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

非常感谢!

既然要处理进程之间的锁(而不是在同一进程上运行的PHP请求),为什么不在伪文件(其路径将充当信号键)上使用flock()呢?如果进程由于任何原因而终止,操作系统会自动解除锁定。