matthimatiker / command-locking-bundle
为所有控制台命令添加可选的锁定功能,用于防止并行执行。
0.2.0
2016-05-28 10:05 UTC
Requires
- php: ^5.5.9 | ^7.0.0
- symfony/symfony: ^2.6.0 | ^3.0.0
Requires (Dev)
- phpunit/phpunit: ~4.0
- satooshi/php-coveralls: ^1.0.0
- webfactory/symfony-application-tests: ^0.5.0
This package is not auto-updated.
Last update: 2024-09-14 19:36:38 UTC
README
有时您希望确保一个 Symfony 控制台命令不会并行运行。此包为所有控制台命令添加了一个可选的锁定功能,可用于防止并行执行。
安装
通过 Composer 安装包
composer require matthimatiker/command-locking-bundle
然后在您的 AppKernel 中注册该包
<?php
// app/AppKernel.php
public function registerBundles()
{
$bundles = array(
// ...
new \Matthimatiker\CommandLockingBundle\MatthimatikerCommandLockingBundle()
);
// ...
}
用法
简单地将 --lock 选项传递给 任何 命令,以确保禁止并行运行
app/console cache:warmup --lock
如果命令尚未终止,并且再次调用(在锁定模式下)相同的命令,则它将被简单跳过,并显示一条通知。
默认的锁定实现依赖于文件系统,并使用 Symfony 的 LockHandler。只要您的应用程序在一个单独的系统上运行,就可以避免并行执行。如果您需要分布式锁定,则必须编写自己的锁管理器。
自定义锁管理器
自定义锁管理器必须实现 \Matthimatiker\CommandLockingBundle\Locking\LockManagerInterface。之后,它必须注册为服务,并标记为 matthimatiker_command_locking.console.lock_manager
my.custom_lock_manager:
class: My\Custom\LockManager
tags:
- { name: matthimatiker_command_locking.console.lock_manager, alias: custom }
必须定义一个别名(例如,本例中的 custom)与标记一起使用,并用于引用新的锁管理器
app/console cache:warmup --lock=custom
已知问题
当子命令按官方文档中所述的方式调用时,由于生命周期事件未触发,锁定无法用于子命令。