防止PHP脚本同时运行多次的最佳方法?

时间:2016-03-18 08:12:13

标签: php mysql block nusoap simultaneous

我有一个长时间运行的脚本(基于设置的30到160秒),它使用NuSOAP从API请求数据,基于此数据,它构建了一个大的~1000-4000行插入查询。它比截断表并插入大查询。

当我一个接一个地运行脚本时,它会产生一个丢失数据的问题。我想阻止这个脚本同时运行两次。

此脚本将来也会通过cron / task scheduler每隔约5-10分钟运行一次。

目前我通过检查文件是否存在来阻止同时运行脚本:

<?php
    header('content-type: application/json');
    ignore_user_abort(true);

    if (!file_exists('lock.txt')) {
        $lock = fopen('lock.txt','w');
        fclose($lock);

        //~450 API requests using NuSOAP.
        //TRUNCATE `table`
        //INSERT ~1000-4000 rows into `table

        $jsonArray = array(utf8_encode('script')=>utf8_encode('finished'));
        unlink('lock.txt');
    } else {
        $jsonArray = array(utf8_encode('script')=>utf8_encode('locked'));
    }
    echo json_encode($jsonArray);
?>

这是阻止脚本同时运行的安全方法吗?是否更好地检查MySQL列是否包含'true'或'false,而不是文件?

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我认为锁定文件可能不是理想的,我宁愿创建一个临时会话变量来检查'True'还是'False'来查找脚本是否正在运行。

或者,我还会跟踪执行每个脚本所花费的实际时间,这对于检查不必要的时间天数和总体平均时间非常有用。

即使您通过CRON Scheduler运行脚本,在使用session_id()之前手动分配session_start(),您仍然可以使用该会话。

但是,Cookie将取决于浏览器,并且不适用于Cron。