geckoboom / scheduler
控制台命令的Cron调度器
1.0.5
2022-10-20 09:42 UTC
Requires
- php: >=7.4
- dragonmantank/cron-expression: ^3.1
- psr/container: ^1.0||^2.0
- psr/simple-cache: >=1.0
- symfony/process: >3.3.0
Requires (Dev)
- dg/bypass-finals: dev-master
- phpunit/phpunit: 9.5.x-dev
- squizlabs/php_codesniffer: 4.0.x-dev
README
目录
简介
命令调度器是管理服务器上计划的控制台命令的绝佳方法。该包允许您在控制台应用程序内控制任务调度。使用调度器时,您的服务器上只需一个cron条目。
安装
可以通过Composer安装:[geckoboom/scheduler](https://packagist.org.cn/packages/geckoboom/scheduler)
composer require geckoboom/scheduler
配置
配置调度器需要几个步骤
- 提供实现
Geckoboom\Scheduler\CallerInterface。
class ReflectionCaller implements \Geckoboom\Scheduler\CallerInterface { protected ReflectionContainer $container; public function call(\Closure $callback){ $args = []; $reflectionMethod = new \ReflectionMethod($callback, '__invoke'); $args = []; foreach ($reflectionMethod->getParameters() as $parameter) { if (!$this->container->has($parameter->getName()) && $parameter->isDefaultValueAvailable()) { $args[$parameter->getName()] = $parameter->getDefaultValue(); } } return $this->container->call($callback, $args); } }
- 提供两个实现
EventMutexInterface和ScheduleMutexInterface。该包基于Psr\SimpleCache\CacheInterface依赖项提供了这些接口的默认实现。您可以通过以下方式执行此操作
$container->add( \Psr\SimpleCache\CacheInterface::class, MyCacheImplementation::class ); $container->add( \Geckoboom\Scheduler\EventMutexInterface::class, \Geckoboom\Scheduler\EventMutex\CacheEventMutex::class ); $container->add( \Geckoboom\Scheduler\ScheduleMutexInterface::class, \Geckoboom\Scheduler\ScheduleMutex\CacheScheduleMutex::class );
或创建您自己的实现
$container->add( \Geckoboom\Scheduler\EventMutexInterface::class, MyEventMutexImplementation::class ); $container->add( \Geckoboom\Scheduler\ScheduleMutexInterface::class, MyScheduleMutexImplementation::class );
- 提供您的
ScheduleRegistrarInterface依赖项。
class MyScheduleRegistrar implements \Geckoboom\Scheduler\ScheduleRegistrarInterface { public function schedule(\Geckoboom\Scheduler\Schedule $schedule) : void { $schedule->command('send:emails', ['--option1' => 'value', 'argument1']) ->daily() ->withoutOverlapping(); $schedule->command('orders:distribute') ->mondays() ->at('14:00') ->runInBackground(); } } ... $container->add( \Geckoboom\Scheduler\ScheduleRegistrarInterface::class, MyScheduleRegistrar::class );
- 提供
Schedule单例依赖项
$container->addShared( \Geckoboom\Scheduler\Schedule::class, function ($di): \Geckoboom\Scheduler\Schedule { $schedule = new \Geckoboom\Scheduler\Schedule( $di->get(\Geckoboom\Scheduler\EventMutexInterface::class), $di->get(\Geckoboom\Scheduler\ScheduleMutexInterface::class), $di->get(\Geckoboom\Scheduler\CommandBuilder::class), '/path/to/project/root', new DateTimeZone('Europe/London') ); $registrar = $di->get(\Geckoboom\Scheduler\ScheduleRegistrarInterface::class); $registrar->schedule($schedule); return $schedule; } );
使用
现在您可以根据适当的框架语法创建可执行脚本或控制台命令。
$service = $container->get(\Geckoboom\Scheduler\ScheduleService::class); $service->run(new \DateTimeImmutable());
最后一步是在我们的服务器上添加一个cron配置条目,该条目每分钟运行您的可执行命令。
* * * * * cd /path-to-your-project && php /path-to-executable-script >> /dev/null 2>&1