任何终止时的清理控制台命令
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
我有以下 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