一、前言
在windows系统中我们通常使用系统自带的计划任务来执行定时任务,在Linux系统中我们通常配合crontab使用shell脚本或者访问url来完成定时任务,laravel的command在Linux中使用很方便,并且laravel中的command也提供了多种时间调度方法。之前一直是运用curl 或者weget 定时发送请求或者运行php脚本 来解决问题 这次想尝试运行shell脚本方式来执行命令 开始尝试在框架里面写一个php文件 直接运行shell脚本来执行发现数据库连接有问题 就搜了下资料用框架自带的命令调度 但是结合实际情况遇到了一些问题
二、新建需要执行的php文件
在你linux操作系统通过cd 命令切换到你的项目根目录
1 执行:php artisan make:command Cronbroadcast
命令 ,会在app\console\commands
命令下生成一个Cronbroadcast.php
的文件。
三、写业务逻辑
其中:
$signature
为这个类定义一个执行名称。$description
为这个类增加信息描述。handle
方法中写自己的业务逻辑。
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\Drawings\Drawinglivebroadcast;
use App\Models\Drawings\Drawingmainbroadcast;
use App\Models\Drawings\Drawingchildbroadcast;
use Illuminate\Support\Facades\Log;
/**
* auth:gj
* time:2021/08/06
* 直录播定时任务
*/
class Cronbroadcast extends Command
{
/**
* The name and signature of the console command.
* 执行地址
* @var string
*/
protected $signature = 'broadcast';
/**
* The console command description.
* 简单描述
* @var string
*/
protected $description = '直录播回调';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* 执行定时任务脚本
* @Author GJ
* @DateTime 2021-08-05T14:16:11+0800
* @param Request $request [description]
* @return [type] [description]
*/
public function handle()
{
try {
Log::info('测试定时任务:'.date('Y-m-d H:i:s'));
}else{
}catch (\Exception $e){
Log::info($e->getMessage());
}
}
}
在控制台中执行该类的handle
方法,使用命令:php artisan broadcast
即可。其中broadcast
为$signature
中定义的名称。
四、框架中配置相关配置
在
commands
同级目录下有一个kernal.php
:
在$commands
属性里引入我们创建的定时测试类,并在schedule
方法中进行配置任务调度时间。
其中everyFiveMinutes
代表每分钟执行一次。
五、Linux中开启定时任务调度 执行shell脚本
首先我们写一个shell脚本
执行这个脚本没问题但是放到crontab定时任务里面就不行了 最后解决了有将近两个小时原来是大家经常遇到的问题 shell脚本在定时器里面需要给上环境变量
定时任务相关我就不介绍了 不懂自己在网上搜 自己学去 从左到右依次是分 时 日 月 周
但是发觉单独执行shell脚本是行的 但是在定时器里面就不执行了
source /etc/profile; 这句在脚本最上方加上就行了 细心的我发现 脚本里面的其他是执行的但是其他地方不执行
好了问题 已经解决
当然 如果想要根据不执行脚本再执行php代码 直接执行 laravel下面的定时任务 可以直接这样执行