在Symfony中锁定命令的最佳方法

在Symfony中锁定命令的最佳方法,symfony,Symfony,我在Symfony中有几个由cron触发的命令。我最近添加了LockHandler,以确保当时只有一个命令在运行,但我发现它更麻烦。以下是我今天遇到的一个场景: 有一个由cron触发的命令:$lock=newlockhandler('someprocess') 它不应该超过15分钟来完成它,但我注意到,在几个小时后,处理已经几个小时没有运行 当我尝试手动运行该命令时,它告诉我已经有另一个实例在运行 所以在这种情况下,我怀疑两件事: 命令运行时锁定了进程,但由于错误,它停止并从未释放锁 这是一个超

我在Symfony中有几个由cron触发的命令。我最近添加了LockHandler,以确保当时只有一个命令在运行,但我发现它更麻烦。以下是我今天遇到的一个场景:

  • 有一个由cron触发的命令:$lock=newlockhandler('someprocess')

  • 它不应该超过15分钟来完成它,但我注意到,在几个小时后,处理已经几个小时没有运行

  • 当我尝试手动运行该命令时,它告诉我已经有另一个实例在运行

  • 所以在这种情况下,我怀疑两件事:

  • 命令运行时锁定了进程,但由于错误,它停止并从未释放锁

  • 这是一个超时,并且在没有释放锁的情况下停止

  • 预防这一问题的最佳做法是什么

    protected function execute(InputInterface $input, OutputInterface $output) {
    
        $lock = new LockHandler('someproccess');
    
        if (!$lock->lock()) {
            $output->writeln('This command is already running in another process.');
    
            return 0;
        }
    
        $this->dosomething();
    
        $lock->release();
    }
    

    引入heartbeat线程,它将更新锁,如果在过去X分钟内没有更新,则释放锁如果出现错误或超时,您应该在symfony日志中获得一些信息?修复错误,将
    $this->doSomething()
    包装在try-catch-finally块中,然后释放
    finally
    -part中的锁。谢谢@Lashane。日志中没有任何内容@ccKep不幸。@Lashane,我创建了一些功能来检查命令运行了多长时间,出于测试目的,我将超时设置为1秒。如果达到超时,我运行release函数,但它似乎没有释放锁。有什么想法吗?引入heartbeat线程,它将更新锁,如果在最后X分钟内没有更新,则释放锁如果出现错误或超时,您应该在symfony日志中获得一些信息?修复错误,将
    $this->doSomething()
    包装在try-catch-finally块中,然后释放
    finally
    -part中的锁。谢谢@Lashane。日志中没有任何内容@ccKep不幸。@Lashane,我创建了一些功能来检查命令运行了多长时间,出于测试目的,我将超时设置为1秒。如果达到超时,我运行release函数,但它似乎没有释放锁。有什么想法吗?