使用 Docker 来开发 PHP,Laradock 系列 5:计划任务 
                            
                                                    
                        
                    
                    
  
                    
                    
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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
          
          
          
                关于 LearnKu
              
                    
                    
                    
 
推荐文章: