組み込みの共有メモリ関数を使用して、単純なノンブロッキング セマフォを 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 スクリプトの複数のインスタンスが互いに重ならないようにするノンブロッキング セマフォです。同時に、スクリプトがセマフォを設定し、それをクリアする前に終了する場合を考慮します。 .
どうもありがとう!