xdeenist / laravel-console-mutex
Laravel 控制台命令的互斥锁。
Requires
- php: ^8.1
- arvenil/ninja-mutex: dev-master#82cbb2c
- illuminate/console: ^10.0|^11.0
- illuminate/support: ^10.0|^11.0
Requires (Dev)
- ext-pdo_mysql: *
- ext-redis: *
- illuminated/testing-tools: ^10.0
- mockery/mockery: ^1.5.1
- orchestra/testbench: ^8.0
- phpunit/phpunit: ^10.5
- predis/predis: ^2.0.2
This package is auto-updated.
Last update: 2024-09-03 10:26:14 UTC
README
Laravel 控制台互斥锁
Laravel 控制台命令的互斥锁。
目录
用法
-
通过 Composer 安装包
composer require illuminated/console-mutex
-
使用
Illuminated\Console\WithoutOverlapping
特质use Illuminated\Console\WithoutOverlapping; class ExampleCommand extends Command { use WithoutOverlapping; // ... }
策略
互斥锁可以通过各种策略来防止重叠
file
(默认)mysql
redis
memcached
默认的file
策略适用于小型应用程序,这些应用程序部署在单个服务器上。如果您的应用程序更复杂,部署在多个节点上,您应考虑使用另一种互斥锁策略。
您可以通过使用$mutexStrategy
字段来更改策略
class ExampleCommand extends Command { use WithoutOverlapping; protected string $mutexStrategy = 'mysql'; // ... }
或者使用setMutexStrategy()
方法
class ExampleCommand extends Command { use WithoutOverlapping; public function __construct() { parent::__construct(); $this->setMutexStrategy('mysql'); } // ... }
高级
设置自定义超时时间
默认情况下,如果互斥锁检测到该命令正在运行,它将立即退出。您可以通过设置一个超时来更改此行为,在该超时期间互斥锁可以等待另一个正在运行的命令完成执行。
您可以通过指定$mutexTimeout
字段来设置超时
class ExampleCommand extends Command { use WithoutOverlapping; // In milliseconds protected ?int $mutexTimeout = 3000; // ... }
或者使用setMutexTimeout()
方法
class ExampleCommand extends Command { use WithoutOverlapping; public function __construct() { parent::__construct(); // In milliseconds $this->setMutexTimeout(3000); } // ... }
以下是$mutexTimeout
字段的处理方式
0
- 不等待(默认);{int}
- 等待指定的毫秒数;null
- 等待正在运行的命令完成执行;
处理多个命令
有时可能需要为多个命令共享互斥锁。您可以通过为所有这些命令设置相同的互斥锁名称来实现这一点。
您应该使用getMutexName()
方法来这样做
class ExampleCommand extends Command { use WithoutOverlapping; public function getMutexName() { return 'shared-for-command1-and-command2'; } // ... }
设置自定义存储文件夹
如果您使用的是file
策略,互斥锁文件将存储在storage/app
文件夹中。
您可以通过覆盖getMutexFileStorage()
方法来更改这一点
class ExampleCommand extends Command { use WithoutOverlapping; public function getMutexFileStorage() { return storage_path('my/custom/path'); } // ... }
故障排除
包含特质但没有发生任何事情?
WithoutOverlapping
特质覆盖了initialize()
方法
trait WithoutOverlapping { protected function initialize(InputInterface $input, OutputInterface $output) { $this->initializeMutex(); parent::initialize($input, $output); } // ... }
如果您也覆盖了initialize()
方法,您必须自己调用initializeMutex()
方法
class ExampleCommand extends Command { use WithoutOverlapping; protected function initialize(InputInterface $input, OutputInterface $output) { // You have to call it first $this->initializeMutex(); // Then goes your custom code $this->foo = $this->argument('foo'); $this->bar = $this->argument('bar'); $this->baz = $this->argument('baz'); } // ... }
有几个特质冲突?
如果您正在使用另一个illuminated/console-%
包,您将获得“特质冲突”错误。
例如,如果您正在构建一个可记录的命令,该命令不允许重叠
class ExampleCommand extends Command { use Loggable; use WithoutOverlapping; // ... }
您将获得特质冲突,因为这两个特质都覆盖了initialize()
方法
如果有两个特质插入具有相同名称的方法,如果未显式解决冲突,则会产生致命错误。
要修复此问题 - 覆盖initialize()
方法并解决冲突
class ExampleCommand extends Command { use Loggable; use WithoutOverlapping; protected function initialize(InputInterface $input, OutputInterface $output) { // Initialize conflicting traits $this->initializeMutex(); $this->initializeLogging(); } // ... }
赞助商
许可证
Laravel 控制台互斥锁是开源软件,许可协议为MIT许可证。