【问题标题】:PHP shared memory vars remain after script prematurely terminatedPHP 共享内存变量在脚本过早终止后仍然存在
【发布时间】:2013-08-13 23:24:27
【问题描述】:

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

非常感谢!

【问题讨论】:

    标签: php shared-memory semaphore


    【解决方案1】:

    既然你正在处理进程之间的锁(而不是说,PHP 请求在同一个进程上运行),为什么不直接在一个虚拟文件上使用flock()(它的路径将充当信号量)钥匙)?如果进程因任何原因终止,操作系统会自动释放锁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多