我有一个Web应用程序,用户可以从中选择要执行的脚本列表,然后将执行添加到mysql中的表中,每个表都有自己的状态,如"待定,"成功& #34; "失败"或者"正在进行中"用户也可以选择停止执行。
问题是只能同时执行一个脚本,以便其他脚本必须等到它完成。
我的环境是LINUX(UBUNTU),脚本是PHP 我虽然做了一个执行php脚本的crontab,但是这个php脚本会从sql表中获取信息,并通过查看是否存在执行"正在进行"来搜索是否存在其他执行。 state如果有一个它将直接退出,否则它将执行具有挂起状态的其他执行。 还有其他解决办法吗?
答案 0 :(得分:0)
使用原子检查更好。使用数据库执行此操作的方式不是原子的,因为在您检查没有其他脚本正在运行之后,但在您编写当前脚本开始之前,另一个进程可能会执行相同的检查,因此您可以执行此操作。将运行两个并发脚本。
此外,如果脚本因任何原因异常终止,它将无法更新数据库,因此其他脚本根本无法启动。
更可靠的方法是使用文件锁定:
$lock_file = 'some_path/process.lock';
$fd = fopen($lock_file, "w");
if (!$fd)
throw new Exception("Can't open file, check permissions on ".$lock_file, 1);
if (!flock($fd, LOCK_EX + LOCK_NB))
throw new AlreadyRunningException("Can't lock the file - another script is already running", 0);
然后,在脚本作业完成后,解锁文件:
flock($fd, LOCK_UN);
fclose($fd);