【发布时间】: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