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

防止PHP脚本同时运行多次的最佳方法?,php,mysql,block,nusoap,simultaneous,Php,Mysql,Block,Nusoap,Simultaneous,我有一个长时间运行的脚本(根据设置,时间从30秒到160秒不等),它使用NuSOAP从API请求数据,并根据这些数据构建一个大的~1000-4000行插入查询。然后截断一个表并插入大查询 当我一个接一个地运行脚本时,它会造成数据丢失的问题。我想防止此脚本同时运行两次 该脚本将来还将通过cron/task scheduler每隔5-10分钟运行一次 目前,我通过检查文件是否存在来阻止同时运行脚本: <?php header('content-type: application/jso

我有一个长时间运行的脚本(根据设置,时间从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”,而不是文件


有更好的方法吗?

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

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

即使在使用
session\u start()


但是,cookie依赖于浏览器,不能与Cron一起使用。

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

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

即使在使用
session\u start()


但是,Cookie依赖于浏览器,不能与Cron一起使用。

使用带有时间戳的数据库条目,这样会更好。使用事务并将运行状态存储在文件/db中。您能否不使用数据库事务(可能是
删除
而不是
截断
?)为了确保您的数据不会以不一致的状态结束?使用文件方法有什么问题?对我来说已经足够好了。它完成了工作,其他一切基本上都是相同的方法,你只需将信息转移到另一种媒介。使用文件的存在,您甚至可以使用该文件来存储错误信息。您是否已经了解了使用文件锁的方法?使用带有时间戳的数据库条目会更好。使用事务并将运行状态存储在文件/db中。您是否可以不使用数据库事务(可能是
删除
而不是
截断
?)为了确保您的数据不会以不一致的状态结束?使用文件方法有什么问题?对我来说似乎已经足够好了。它完成了工作,其他一切基本上都是相同的方法,您只需将信息移动到另一个媒体。使用文件的存在,您甚至可以使用该文件存储错误信息。您有吗您已经了解了如何使用文件锁?由cron作业运行的脚本不会有会话。会话变量不是每用户一类的东西吗?该脚本将由cron/任务和用户两个运行。由cron作业运行的脚本不会有会话。会话变量不是每用户一类的东西吗?该脚本将由两个cro运行n/任务和用户。