我有一个脚本在 cron 中每 10 分钟运行一次,并且希望脚本在 9 分钟后退出以停止任何重叠。
该脚本正在运行一个 foreach 循环,轮询收件箱并对收件箱中的每条消息运行一系列函数。
我知道我可以使用 set_time_limit 但如果脚本运行超过 9 分钟,我会寻找一种更优雅的方式在循环结束时退出脚本。
我有一个脚本在 cron 中每 10 分钟运行一次,并且希望脚本在 9 分钟后退出以停止任何重叠。
该脚本正在运行一个 foreach 循环,轮询收件箱并对收件箱中的每条消息运行一系列函数。
我知道我可以使用 set_time_limit 但如果脚本运行超过 9 分钟,我会寻找一种更优雅的方式在循环结束时退出脚本。
如果我了解您的需要,您需要防止并行运行相同的脚本。正确的解决方案是实现锁定或队列机制,因此同一脚本不会并行运行。
你可以使用文件| 分贝 | 内存锁。文件是最简单的。
1. 检查锁定文件是否存在
2. 如果存在
3. 等待 X 秒 -> 转到 1
4. 创建文件
5. 继续你的脚本
... ... 6. 脚本结束 -> 删除文件。
将此逻辑放在使用此锁的每个脚本中。你也不能创建/删除文件,而是修改其中的内容(比如在 1 和 0 之间切换)
您不想在工作的一半中途关闭工作(除非代码出现故障并且您想中止......但这不是日常用例)
你需要一个单例管理。例如,启动时将令牌变为“正在运行”,然后在退出时将其变为“未运行”(不要忘记错误管理)。因此,当作业的第二次迭代尝试重叠时,测试令牌可以让您知道它是否应该运行。
您可以使用数据库令牌或文件令牌等。
这不是真正的做事方式,但如果必须,这里有一个建议:
在代码顶部记下开始时间,然后在每次迭代结束时检查:
$start_time = time();
{start execution loop}
// Do your stuff here
if ((time() - $start_time) > (9*60)) { // execution time in seconds
exit;
}
{go around again}
您最好找到一种方法来确保代码在可用时间内完成,或者防止第二个实例在第一个实例完成之前启动。