我有一个长时间运行的脚本(基于设置的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,而不是文件?
有更好的方法吗?
答案 0 :(得分:0)
我认为锁定文件可能不是理想的,我宁愿创建一个临时会话变量来检查'True'还是'False'来查找脚本是否正在运行。
或者,我还会跟踪执行每个脚本所花费的实际时间,这对于检查不必要的时间天数和总体平均时间非常有用。
即使您通过CRON Scheduler运行脚本,在使用session_id()
之前手动分配session_start()
,您仍然可以使用该会话。
但是,Cookie将取决于浏览器,并且不适用于Cron。