我试图阻止我的cron脚本允许它并行运行。我需要它,以便在没有当前执行时,脚本将被允许运行直到它完成,脚本超时或发生异常。
我一直在尝试使用PHP flock函数来启用文件锁,运行脚本然后释放锁。但是,它仍然看起来我可以并行多次运行脚本。我错过了什么吗?
顺便说一下,我正在使用Mac文件系统在Mac OS X上开发,也许这就是文件锁被忽略的原因?虽然PHP文档只关于NTFS文件系统?
// Construct cron lock file path
$cronLockFilePath = realpath(APPLICATION_PATH . '/locks/cron');
// Get cron lock file
$cronLockFile = fopen($cronLockFilePath, 'r');
// Lock cron lock file
if (flock($cronLockFile, LOCK_EX)) {
echo 'lock';
sleep(10);
} else {
echo 'no lock';
}
答案 0 :(得分:3)
你的想法基本上是正确的,但修补文件锁通常会导致奇怪的行为。
只需在脚本启动时创建一个文件并在最后删除它。该文件的存在将指示cron是否已在运行。绝对确定,即使cron在中途遇到错误,文件也会被删除。
答案 1 :(得分:1)
来自文档:
警告
在某些操作系统上,flock()是 在流程层面实施。什么时候 使用像多线程的服务器API 您可能无法依赖的ISAPI flock()保护文件免受其他攻击 PHP脚本并行运行 同一服务器实例的线程!
您可以尝试创建和删除文件,或者在其中写入内容。
答案 2 :(得分:0)
我认为你可以做的是在脚本开始执行时在某处编写一个常规文件(lock.txt或其他东西),没有任何flocks,并在脚本停止运行时将其删除。然后始终检查初始化该文件是否已存在 - 另一个实例正在运行。