简单PHP文件锁
刚子 发布于 阅读:3
PHP在做一些定时器任务的时候,为了防止上一次任务没执行完毕,下一次任务就被执行了,再非必要使用数据库字段做标记的情况下,最简单的办法就是使用文件锁。
他的原理就是当一个进程执行该文件时,其他进程执行的时候会自动退出。顶部的超时秒数要跟定时任务间隔时间保持一致。
<?php
// 设置脚本最大执行时间
set_time_limit(10);
$lock_file = __DIR__ . '/cron_order.lock';
$fp = null; // 初始化变量,防止未定义警告
try {
// 1. 打开锁文件
$fp = fopen($lock_file, 'c+');
if (!$fp) {
throw new Exception("无法打开锁文件");
}
// 2. 尝试获取独占锁
if (!flock($fp, LOCK_EX | LOCK_NB)) {
fclose($fp);
exit("已有任务在运行,本次跳过\n");
}
// 3. 注册兜底释放函数
register_shutdown_function(function() use ($fp) {
// 增加判断:确保文件句柄存在再操作
if (is_resource($fp)) {
flock($fp, LOCK_UN);
fclose($fp);
}
});
// --- 正式业务代码 ---
// 模拟一个耗时操作
// sleep(15); // 如果解开注释,脚本会在10秒时被杀死,但锁依然会通过 shutdown_function 释放
} catch (Exception $e) {
error_log("Task Error: " . $e->getMessage());
}
// 脚本结束,shutdown_function 自动接管善后工作
?>