利用linux定时任务,只需要一个 Cron 条目,即可开启你的项目中所有定时任务
一、crontab 了解
注:简单的记成:分、时、日、月、周,通配符*配合位置表示任意值(如每分钟、每小时等)
1. cron相关命令
# 显示一个cron列表,其内容是由当前用户启动的任务
crontab -l
# 编辑自己的cron列表
crontab -e
2. 简单的栗子
* * * * * /path/php artisan myCommand # 每分钟执行
*/1 * * * * /path/php artisan myCommand # 每分钟执行,同上
*/5 * * * * /path/php artisan myCommand # 每5分钟执行
10,20 * * * * /path/php artisan myCommand # 每小时10分、20分时执行
1-31,35 * * * * /path/php artisan myCommand # 每小时1至31分、35分执行
有时候我们觉得每分钟执行一次间距太大了,我想改成每20秒中执行
# 请参考这个栗子
* * * * * /path/php artisan myCommand
* * * * * sleep 20 ; /path/php artisan myCommand
* * * * * sleep 40 ; /path/php artisan myCommand
#看到这里你应该秒懂了,其实就是延时20秒启动一次即可
二、Laravel 控制台
1、通过laravel提供的基础命令来生成一个Command,如:
php artisan make:command MyCommand
2、命令执行成功后会生成 app\Console\Commands\MyCommand.php
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class MyCommand extends Command
{
// 控制台命令的名称和签名。
protected $signature = 'command:MyCommand';
//控制台命令描述。
protected $description = 'Tell me,im great!';
//
public function __construct()
{
parent::__construct();
}
//执行控制台命令。
public function handle()
{
// 入口方法
Log::info('----定时任务----');
}
}
3、打开 app\Console\Kernel.php
// ...
protected $commands = [
// 加入可用命令列表
\App\Console\Commands\MyCommand::class,
];
// ...
protected function schedule(Schedule $schedule)
{
// 批量执行时需要在这里定义,这里假设为每分钟执行
$schedule->command('command:MyCommand')->everyMinute();
}
// ...
4、测试
# 查看是否添加了命令
> php artisan list
# ...
command
command:MyCommand Tell me,im great!t! # 这里出现了即代表可用
# ...
# 单命令执行
php artisan command:MyCommand #去看记录的日志就可以了
测试适合开发环境
生产环境添加crontab即可
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
扩展
Linux下定时任务生成的日志是root用户,导致其他日志无法写入
解决办法:
修改
\laravel\vendor\laravel\framework\src\Illuminate\Log\Writer.php
这边我只修改了对Daily的记录形式的权限