gpt4 book ai didi

php - 如何检测PHP脚本是否已经在运行?

转载 作者:行者123 更新时间:2023-12-02 22:56:41 33 4
gpt4 key购买 nike

我有一个 cron 脚本,每 10 分钟执行一次 PHP 脚本。该脚本检查队列并处理队列中的数据。有时,队列有足够的数据来持续 10 分钟以上的处理,从而有可能两个脚本尝试访问相同的数据。我希望能够检测脚本是否已经在运行,以防止启动脚本的多个副本。我考虑过创建一个数据库标志,表示脚本正在处理,但如果脚本崩溃,它会使其处于正常状态。有没有一种简单的方法可以判断 PHP 脚本是否已经通过 PHP 或 shell 脚本运行?

最佳答案

您可以只使用锁定文件。 PHP 的 flock()函数为 Unix 提供了一个简单的包装器 flock函数,它提供文件的咨询锁。

如果您没有显式释放它们,那么当持有它们的进程终止时,操作系统会自动为您释放这些锁,即使它异常终止。

您还可以遵循松散的 Unix 约定,将锁定文件设为“PID 文件” - 也就是说,在获得文件锁定后,让脚本将其 PID 写入其中。即使您从未在脚本中阅读过此内容,如果您的脚本挂起或变得疯狂并且您想要找到其 PID 以便手动杀死它,这对您来说也会很方便。

这是一个复制/粘贴就绪的实现:

#!/usr/bin/php
<?php

$lock_file = fopen('path/to/yourlock.pid', 'c');
$got_lock = flock($lock_file, LOCK_EX | LOCK_NB, $wouldblock);
if ($lock_file === false || (!$got_lock && !$wouldblock)) {
throw new Exception(
"Unexpected error opening or locking lock file. Perhaps you " .
"don't have permission to write to the lock file or its " .
"containing directory?"
);
}
else if (!$got_lock && $wouldblock) {
exit("Another instance is already running; terminating.\n");
}

// Lock acquired; let's write our PID to the lock file for the convenience
// of humans who may wish to terminate the script.
ftruncate($lock_file, 0);
fwrite($lock_file, getmypid() . "\n");

/*
The main body of your script goes here.
*/
echo "Hello, world!";

// All done; we blank the PID file and explicitly release the lock
// (although this should be unnecessary) before terminating.
ftruncate($lock_file, 0);
flock($lock_file, LOCK_UN);

只需将锁定文件的路径设置为您喜欢的位置即可。

关于php - 如何检测PHP脚本是否已经在运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4140552/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com