frankdejonge/locked-console-command

一个用于锁定symfony/console命令的装饰器。

3.1.1 2016-06-30 12:12 UTC

This package is auto-updated.

Last update: 2024-09-06 08:21:51 UTC


README

Author Build Status Quality Score Software License Packagist Version Total Downloads Coverage Status

在某些情况下,你可能只想让某个特定命令的一个进程能够在同一时间运行。此包中提供的命令装饰器通过使用Symfony的Filesystem组件中的LockHandler类来实现这一点。

鸣谢

这个想法最初不是我的,我是从@Seldaek那里偷来的。

安装

composer require frankdejonge/locked-console-command

使用

你所需要做的,就是将命令包裹起来

<?php

use FrankDeJonge\LockedConsoleCommand\LockedCommandDecorator;
use Symfony\Component\Console\Application;

$application = new Application;
$app->add(new LockedCommandDecorator(new YourConsoleCommand()));
$app->run();

Laravel使用

use FrankDeJonge\LockedConsoleCommand\LockedCommandDecorator;
Artisan::add(new LockedCommandDecorator(new SomeCommand()));

锁定是如何工作的?

装饰器使用文件锁(由Symfony的LockHandler提供)来确保在执行命令之前设置锁并在执行命令之后释放锁。

如果已经为某个特定任务设置了锁,则会显示一条信息,并阻止装饰命令运行。

配置

有两个可配置的部分可以影响锁定。

  1. 锁名称
  2. 锁路径

通过构造函数参数注入

$command = new LockedCommandDecorator($yourCommand, 'lock-name', '/lock/path'));

通过包装命令的接口实现

  • 实现FrankDeJonge\LockedConsoleCommand\SpecifiesLockName::getLockName()
  • 实现FrankDeJonge\LockedConsoleCommand\SpecifiesLockPath::getLockPath()

SpecifiesLockName接口特别适用于动态锁名称,例如

class SomeQueueWorker extends Command implements SpecifiesLockName
{
    public function getLockName(InputInterface $input)
    {
        return 'root:name:'.$input->getArgument('worker-id');
    }
}