madlab / multi-server-scheduling
此包扩展了Laravel的本地Command Event类,以在多服务器环境中添加防止事件重叠的功能。这是通过使用Laravel Cache实现的。
v1.1.0
2017-02-05 18:37 UTC
Requires
- php: >=5.5.9
- laravel/framework: >=5.1
This package is auto-updated.
Last update: 2024-09-26 20:19:46 UTC
README
此包扩展了Laravel的本地任务调度,包括在多Web服务器环境中锁定事件和阻止它们重叠的能力。
它的工作方式类似于Laravel的withoutOverlapping
功能,但锁文件是写入Cache,而不是本地文件系统,并且每个服务器生成一个唯一的密钥来锁定命令。
为了防止短运行命令的锁持续时间不足的情况,我们在命令完成和下一次执行时间之间实施至少10秒的间隔,因此如果命令每分钟运行一次,但完成时间在50到59秒之间,则下一次命令将延迟一分钟。我们还自动在1小时后过期任何锁。
您还可以启用将日志记录到Laravel的logfile,以确保一切正常工作。
安装
$ composer require madlab/multi-server-scheduling
新的调度器使用Laravel的缓存来跟踪当前正在执行事件的哪个服务器。您必须确保您已经配置了一个由所有服务器(如memcache或redis)分布式且可访问的缓存驱动程序。
现在我们想更改默认的调度IoC以使用此替代方案。在app\Console\Kernel.php中添加以下函数
use Illuminate\Contracts\Cache\Repository as Cache; use madlab\MultiServerScheduling\Schedule as MultiServerSchedule; /** * Define the application's command schedule. * * @return void */ protected function defineConsoleSchedule() { $this->app->instance( Schedule::class, $schedule = new MultiServerSchedule( $this->app[Cache::class], MultiServerSchedule::LOG_LEVEL_ABANDONED ) ); $this->schedule($schedule); }
用法
在编写您的计划时,只需将"withoutOverlappingCache()"添加到命令中,例如。
$schedule->command('inspire') ->daily() ->withoutOverlappingCache();
这将防止多个服务器同时执行相同的事件。
日志记录
当在app\Console\Kernal.php中初始化调度器时,您可以通过传入3种不同的日志级别。
- LOG_LEVEL_NONE: 禁用日志记录
- LOG_LEVEL_ABANDONED: 当服务器尝试执行已运行10分钟以上的任务时,将写入日志
- LOG_LEVEL_VERBOSE: 最详细的,将记录任何时候尝试、获取或释放锁
支持
此包由Nick Ashley在MadLab, LLC创建,如果您需要付费支持,请通过MadLab.com联系我们。