2016-03-18 235 views
0

我有基于此数据使用的NuSOAP的API请求数据时,它建立一个大〜1000-4000行插入查询长时间运行的脚本(从30到160秒,根据设置的任何地方)。它比截断表并插入大查询。防止PHP脚本同时运行多次的最佳方法?

当我运行的脚本过于紧密定时一前一后它会创建它丢失数据的问题。我想阻止这个脚本同时运行两次。

该脚本将在未来还可以通过cron /任务调度每隔〜运转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,而不是文件?

有没有更好的办法?

+0

使用带时间戳的数据库条目会更好。 – shikhar

+0

在文件/ db中使用事务和存储运行状态。 – Gogol

+0

您是否可以不使用数据库事务(可能是'DELETE'而不是'TRUNCATE'?)来确保您的数据不会以不一致的状态结束? –

回答

0

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

可选,我还要跟踪执行每个脚本,可以检查不必要的时间日期和总的平均时间采取有效的实际时间。

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

然而,饼干将是依赖于浏览器,也不会通过计划工作。

+0

由cron作业运行的脚本不会有会话。 – Yoshi

+0

不是每个用户类型的会话变量?该脚本将由cron/task和用户运行。 – displaynn