«

简单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 自动接管善后工作
?>