matthimatiker/command-locking-bundle

为所有控制台命令添加可选的锁定功能,用于防止并行执行。

0.2.0 2016-05-28 10:05 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:36:38 UTC


README

Build Status Coverage Status

有时您希望确保一个 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

已知问题

当子命令按官方文档中所述的方式调用时,由于生命周期事件未触发,锁定无法用于子命令。