使用 Docker 来开发 PHP,Laradock 系列 5:计划任务

PHP

Laravel还有一个调度器功能,可以在定义的时间内运行command/task,可以是每分钟、每小时、每天,甚至某个时间。 它通常用于自动报告的调度程序,例如报告每天统计产品/项目的数量。或者,如果您是一个开发人员,您可能希望每天记录各种数据以进行分析。

Laradock中的PHP-Worker仍然还有这样的一个功能可供使用。现在是时候开始了!

前提条件

如果你了解worker,那么一切都变得更容易判断。


准备调度测试命令

让我们创建这个命令:

app\Console\Commands\ExampleSchedulerTest.php :

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;

class ExampleSchedulerTest extends Command
{
    /**
     * 控制台命令的名称和签名。
     *
     * @var string
     */
    protected $signature = 'example:scheduler-test {logLevel} {--message=}';

    /**
     * 控制台命令描述。
     *
     * @var string
     */
    protected $description = 'Command for logging schedulers';

    /**
     * 创建一个新的命令实例。
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * 执行控制台命令。
     *
     * @return mixed
     */
    public function handle()
    {
        $arguments = $this->arguments();
        $options = $this->options();
        $options['message'] = $options['message'] ?? 'lorem ipsum dolor sit amet';

        switch ($arguments['logLevel']) {
            case 'emergency':
                Log::emergency($options['message']);
                break;
            case 'alert':
                Log::alert($options['message']);
                break;
            case 'critical':
                Log::critical($options['message']);
                break;
            case 'error':
                Log::error($options['message']);
                break;
            case 'warning':
                Log::warning($options['message']);
                break;
            case 'notice':
                Log::notice($options['message']);
                break;
            case 'info':
                Log::info($options['message']);
                break;
            case 'debug':
                Log::debug($options['message']);
                break;
            default:
                Log::debug($options['message']);
                break;
        }
    }
}

注册该命令并在app\Console\Kernel.php设置调度程序 :

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

use App\Console\Commands\ExampleSchedulerTest;

class Kernel extends ConsoleKernel
{
    /**
     * 应用程序提供的命令。
     *
     * @var array
     */
    protected $commands = [
        ExampleSchedulerTest::class,
    ];

    /**
     * 定义应用程序的命令调度。
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('example:scheduler-test debug --message="debug everyMinute"')->everyMinute();
        $schedule->command('example:scheduler-test info --message="info everyFiveMinutes"')->everyFiveMinutes();
        $schedule->command('example:scheduler-test notice --message="notice everyTenMinutes"')->everyTenMinutes();
        $schedule->command('example:scheduler-test warning --message="warning everyFifteenMinutes"')->everyFifteenMinutes();
        $schedule->command('example:scheduler-test error --message="error everyThirtyMinutes"')->everyThirtyMinutes();
        $schedule->command('example:scheduler-test critical --message="critical hourly"')->hourly();
        $schedule->command('example:scheduler-test alert --message="alert hourlyAt 17"')->hourlyAt(17);
        $schedule->command('example:scheduler-test emergency --message="emergency daily"')->daily();
    }

    /**
     * 为应用程序注册命令。
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

你可以先尝试命令,以确保它的工作,通过执行这个命令在你的工作空间 bash 内的项目:

php artisan example:scheduler-test debug --message="debug message"

设置调度器配置

我们仍然使用我们的例子:

- projects
  |_ my-awesome-laravel-app 
  |_ laradock

在 laradock 目录中查找这个workspace\crontab\laradock文件。

- projects
  |_ my-awesome-laravel-app 
  |_ laradock
     |_ workspace
        |_ crontab
           |_ laradock

然后确保workspace\crontab\laradock中的行没有被注释掉。内容应该是这样的:

* * * * * laradock /usr/bin/php /var/www/artisan schedule:run >> /dev/null 2>&1

在 laradock 目录中,你会发现这个文件php-worker\supervisor .d\laravel-scheduler.conf.example。将此文件复制到my-awesome-laravel-app-scheduler.conf(名称可以不同,只要以 .conf 结尾即可)。

- projects
  |_ my-awesome-laravel-app 
  |_ laradock
     |_ php-worker
        |_ supervisord.d
           |_ laravel-scheduler.conf.example
           |_ my-awesome-laravel-app-scheduler.conf
     |_ workspace
        |_ crontab
           |_ laradock

然后修改my-awesome-laravel-app-scheduler.conf内容为:

[program:my-awesome-laravel-app-scheduler]
process_name=%(program_name)s_%(process_num)02d
command=/bin/sh -c "while [ true ]; do (php /var/www/my-awesome-laravel-app/artisan schedule:run --verbose --no-interaction &); sleep 60; done"
autostart=true
autorestart=true
numprocs=1
user=laradock
redirect_stderr=true

这就是调度器配置。


运行或重新启动 PHP-Worker 容器

如果你还没有运行php-worker容器,在 laradock 目录执行这个命令:

docker-compose up -d php-worker

如果它已经运行,你可能想要重新启动它,使用这个命令:

docker-compose restart php-worker

检查 Laravel 日志

在你的 laravel 应用程序的storage/logs中查找最新的日志文件,你应该会看到类似的日志:

[2020-03-23 17:41:00] local.DEBUG: debug everyMinute  
[2020-03-23 17:41:02] local.INFO: info everyFiveMinutes  
[2020-03-23 17:41:04] local.NOTICE: notice everyTenMinutes  
[2020-03-23 17:41:55] local.DEBUG: debug everyMinute  
[2020-03-23 17:42:55] local.DEBUG: debug everyMinute  
[2020-03-23 17:43:55] local.DEBUG: debug everyMinute  
[2020-03-23 17:44:56] local.DEBUG: debug everyMinute  
[2020-03-23 17:45:55] local.DEBUG: debug everyMinute  
[2020-03-23 17:45:56] local.INFO: info everyFiveMinutes  
[2020-03-23 17:45:57] local.WARNING: warning everyFifteenMinutes  
[2020-03-23 17:46:55] local.DEBUG: debug everyMinute  
[2020-03-23 17:47:56] local.DEBUG: debug everyMinute  
[2020-03-23 17:48:56] local.DEBUG: debug everyMinute  
[2020-03-23 17:49:56] local.DEBUG: debug everyMinute  
[2020-03-23 17:50:56] local.DEBUG: debug everyMinute  
[2020-03-23 17:50:56] local.INFO: info everyFiveMinutes  
[2020-03-23 17:50:57] local.NOTICE: notice everyTenMinutes  
[2020-03-23 17:51:56] local.DEBUG: debug everyMinute  
[2020-03-23 17:52:56] local.DEBUG: debug everyMinute  
[2020-03-23 17:53:56] local.DEBUG: debug everyMinute  
[2020-03-23 17:54:56] local.DEBUG: debug everyMinute  
[2020-03-23 17:55:56] local.DEBUG: debug everyMinute  
[2020-03-23 17:55:57] local.INFO: info everyFiveMinutes  
[2020-03-23 17:56:56] local.DEBUG: debug everyMinute  
[2020-03-23 17:57:56] local.DEBUG: debug everyMinute  
[2020-03-23 17:58:56] local.DEBUG: debug everyMinute  
[2020-03-23 17:59:56] local.DEBUG: debug everyMinute  
[2020-03-23 18:00:56] local.DEBUG: debug everyMinute  
[2020-03-23 18:00:58] local.INFO: info everyFiveMinutes  
[2020-03-23 18:00:59] local.NOTICE: notice everyTenMinutes  
[2020-03-23 18:01:00] local.WARNING: warning everyFifteenMinutes  
[2020-03-23 18:01:01] local.ERROR: error everyThirtyMinutes  
[2020-03-23 18:01:02] local.CRITICAL: critical hourly  

在探索 Laradock 调度中获得乐趣!


laravel version used: 6.0 LTS
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://dev.to/dendihandian/php-worker-f...

译文地址:https://learnku.com/php/t/43380

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!