【问题标题】:Best way to prevent PHP script from running more than once simultaneously?防止PHP脚本同时运行多次的最佳方法?
【发布时间】:2016-03-18 08:12:13
【问题描述】:

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

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

此脚本将来也将通过 cron/task 调度程序每隔约 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”而不是文件更好?

有更好的方法吗?

【问题讨论】:

  • 使用带时间戳的数据库条目会更好。
  • 使用事务并将运行状态存储在文件/db中。
  • 您能不能不使用数据库事务(可能是DELETE 而不是TRUNCATE?)来确保您的数据不会最终处于不一致的状态?
  • 使用文件方法有什么问题?对我来说似乎足够好。它完成了工作,其他一切基本上都是相同的方法,您只需将信息移动到另一个媒体。使用文件的存在,您甚至可以使用该文件来存储错误信息。
  • 你已经看过this way 使用文件锁了吗?

标签: php mysql block nusoap simultaneous


【解决方案1】:

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

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

即使您在使用session_start() 之前手动分配session_id(),通过CRON 调度程序运行脚本,您仍然应该能够使用会话。

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

【讨论】:

  • 由 cron 作业运行的脚本不会有会话。
  • 会话变量不是每个用户的事情吗?该脚本将由 cron/task 和用户运行。
猜你喜欢
  • 2014-02-05
  • 1970-01-01
  • 2012-11-29
  • 2015-02-10
  • 2020-12-27
  • 2018-04-26
  • 2012-12-21
  • 2014-12-18
  • 1970-01-01
相关资源
最近更新 更多