laravel中有一个很强大上的功能,只需要在服务器上添加一个cron条目,就可以定时执行所有的laravel任务。
一 、创建Command文件
php artisan make:console RefreshToken
创建app/Console/Commands 下创建RefreshToken.php
取一个名字
protected $signature = 'refreshToken';
添加描述
protected $description = 'Refresh Api Token';
在 handle() 方法中实现功能
public function handle() { Log::info('Token Refreshed'); }
二、在Kernel.php 文件中注册
protected $commands = [ \App\Console\Commands\Inspire::class, \App\Console\Commands\RefreshToken::class, //添加class ]; protected function schedule(Schedule $schedule) { $schedule->command('refreshToken') ->everyMinute(); }
三、在服务的/var/spool/cron/root文件中添加代码
在命令行输入
crontab -e
添加如下代码
* * * * * /usr/local/php/bin/php /data/wwwroot/test/artisan schedule:run 1>> /dev/null 2>&1
不需要重启cron服务,因为系统每分钟都会读一遍/var/spool/cron目录下的文件。
开始定时任务
crontab -l
或许之后你要结束任务 (此操作删除所有已设定的定时任务,谨慎操作)
crontab -r
问题锦集
1、如果发现按照如下配置还是不能执行的话,可以用以下方法排除问题:
看一下命令有没有使用绝对路径,比如这里使用/usr/local/php/bin/php而不是php,使用/data/wwwroot/test/artisan而不是artisan。
如果已经使用了绝对路径还是不执行,那就直接在命令行输入/usr/local/php/bin/php /data/wwwroot/test/artisan schedule:run 1>> /dev/null 2>&1,看看有没有执行,如果没有执行,那就是laravel代码的问题,如果执行了说明是环境变量的问题,好好检查路径的问题。如果不知道php在什么地方,在命令行输入which php,就会提示你php安装在什么位置了。
如果使用绝对路径还是执行不成功,使用tail -f /var/log/cron查看crontab日志,有如下信息:
第一行显示crontab已经成功执行了,但第二行报错显示/usr/share/httpd这个文件夹不存在,虽然不知道为什么要关联这个文件夹,但不理三七二十一,在/usr/share添加了httpd文件夹后就能正常执行了
如果还是没有自动执行的话,检查一下dev/null文件的权限。
例如我的终端一直收到这样的信息
然后查看一下这个文件的消息,发现执行crontab的用户没有权限写入dev/null文件,如下图:
这里的dev/null是上面在添加cron任务时填写的。> /dev/null 2>&1 表示标准输出流和标准错误流会被重定向到/dev/null。
调整一下dev/null文件的权限:
chmod 666 /dev/null
2、执行crontab -e时先出现一串错误,回车后才显示正常
错误如下
Error detected while processing /home/centos/.vimrc: line 54: E518: Unknown option: autochdir line 92: E518: Unknown option: foldenable ...
这是由于系统没有配置默认编辑器造成的,可以通过如下命令查看默认编辑器
echo $EDITOR
如果显示为空,则表示系统没有配置默认编辑器。
编辑~/.bashrc
vim ~/.bashrc
在文件末尾加上“export EDITOR=vim”
然后执行source ~/.bashrc,生效配置
source ~/.bashrc
此时执行crontab -e就没有错误信息显示了