geckoboom/scheduler

控制台命令的Cron调度器

1.0.5 2022-10-20 09:42 UTC

This package is auto-updated.

Last update: 2024-09-20 13:49:13 UTC


README

目录

  1. 简介
  2. 安装
  3. 配置
  4. 使用
  5. 调度
    1. 调度频率选项
    2. 真理测试约束 6高级

简介

命令调度器是管理服务器上计划的控制台命令的绝佳方法。该包允许您在控制台应用程序内控制任务调度。使用调度器时,您的服务器上只需一个cron条目。

安装

可以通过Composer安装:[geckoboom/scheduler](https://packagist.org.cn/packages/geckoboom/scheduler)

composer require geckoboom/scheduler

配置

配置调度器需要几个步骤

  1. 提供实现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);     
    }
}
  1. 提供两个实现EventMutexInterfaceScheduleMutexInterface。该包基于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
    );
  1. 提供您的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
);
  1. 提供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