任何终止时的清理控制台命令

Cleanup console command on any termination

我有以下 Laravel 5.3 命令的(简单)锁定代码:

private $hash = null;
public final function handle() {
    try { 
        $this->hash = md5(serialize([ static::class, $this->arguments(), $this->options() ]));
        $this->info("Generated signature ".$this->hash,"v");

        if (Redis::exists($this->hash)) {
            $this->hash = null;
            throw new \Exception("Method ".$this->signature." is already running");
        }            
        Redis::set($this->hash, true);                                    
        $this->info("Running method","vv");
        $this->runMutuallyExclusiveCommand(); //Actual command is not important here
        $this->cleanup();
    } catch (\Exception $e) {
        $this->error($e->getMessage());
    } 
}

public function cleanup() {
    if (is_string($this->hash)) {
        Redis::del($this->hash);
    }
}

如果允许命令正常执行其执行周期(包括在出现 PHP 异常时的处理),则此方法工作正常。但是,当命令通过其他方式中断时(例如 CTRL-C 或终端 window 关闭时),问题就会出现。在那种情况下,清理代码不是 运行 并且命令被认为仍然是 "executing" 所以我需要手动从缓存中删除条目以重新启动它。我在 __destruct 函数中尝试了 运行 cleanup 代码,但似乎也没有调用它。

我的问题是,有没有办法在命令终止时将某些代码设置为 运行,而不管它是如何终止的?

简短的回答是否定的。当您通过 Ctrl-C 或关闭终端终止 运行ning 进程时,您将终止它。您需要在链接到您的清理代码的 shell 中有一个中断,但这超出了范围。

但是还有其他选择。 Cron 作业可以 运行 间歇性地执行清理任务和其他有用的事情。您还可以在当前代码之前创建 运行s 的启动例程。当您执行启动例程时,它可以为您进行清理,然后调用您当前的例程。我相信你最好的选择是使用一个 cron 作业,它只按给定的时间间隔 运行s 然后在缓存中查找不再合适的条目,然后清除它们。这是一个不错的网站,可让您开始使用 cron 作业 https://www.linux.com/learn/scheduling-magic-intro-cron-linux