从脚本列表一次执行一个PHP脚本

时间:2015-04-09 22:37:03

标签: php unix

我有一个Web应用程序,用户可以从中选择要执行的脚本列表,然后将执行添加到mysql中的表中,每个表都有自己的状态,如"待定,"成功& #34; "失败"或者"正在进行中"用户也可以选择停止执行。

问题是只能同时执行一个脚本,以便其他脚本必须等到它完成。

我的环境是LINUX(UBUNTU),脚本是PHP 我虽然做了一个执行php脚本的crontab,但是这个php脚本会从sql表中获取信息,并通过查看是否存在执行"正在进行"来搜索是否存在其他执行。 state如果有一个它将直接退出,否则它将执行具有挂起状态的其他执行。 还有其他解决办法吗?

1 个答案:

答案 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);