使用 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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。