frankdejonge / locked-console-command
一个用于锁定symfony/console命令的装饰器。
3.1.1
2016-06-30 12:12 UTC
Requires
- php: >=5.5.9
- symfony/console: ~3.0
- symfony/filesystem: ~3.0
Requires (Dev)
- henrikbjorn/phpspec-code-coverage: ~1.0
- phpspec/phpspec: ~2.1
README
在某些情况下,你可能只想让某个特定命令的一个进程能够在同一时间运行。此包中提供的命令装饰器通过使用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提供)来确保在执行命令之前设置锁并在执行命令之后释放锁。
如果已经为某个特定任务设置了锁,则会显示一条信息,并阻止装饰命令运行。
配置
有两个可配置的部分可以影响锁定。
- 锁名称
- 锁路径
通过构造函数参数注入
$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'); } }