-
PHP定时任务,不依赖于框架种类,意思是可以移植到ThinkPHP和Laravel中。同时可以方便在一个定时任务中分发多个子任务,这样就可以实现一个定时来运行多个计划任务,而不再次开一个php-fpm。
1. 前言:
已知Laravel里面有自带的定时任务调度计划—— “app/Console/Kernel.php
的 schedule”。
你可以参考此博文:https://blog.csdn.net/stand_forever/article/details/89429881来实现laravel自带的任务定时计划功能。
最新版的TP里面不知道有没有自带的定时任务计划。
2. 制作:
a)安装依赖:composer require easy-task/easy-task
b)在控制器里面引入依赖:use EasyTask\Task;
具体使用方法参考文档:https://gitee.com/392223903/EasyTask
c)写一个api来启动定时函数:public/index.php/api/enhance/interval_run?secret=&task_class=
d)写一个任务分配接口+函数:public/index.php/api/enhance/interval_func?task_info=&task_class=
3. 运行和停止定时任务:
a)启动定时任务:http://192.168.131.129/xxx/public/index.php/api/enhance/interval_run?secret=&task_class=
b)停止所有定时任务(也可以重启服务器,因为设置了php-fpm进程挂掉重启,所以不能杀死单个php-fpm。总之建议重启服务器。):[root@localhost ~]# killall php-fpm
c)已设置每40s运行api_url接口一次
d)此文件会被缓存起来,若使用其他可变的函数,请移步IntervalFunc.php定义。
如下:定时器使用函数
<?php
namespace App\Http\Controllers\Enhance;
use App\Http\Controllers\EnhanceSafeCheck;
use Illuminate\Http\Request;
use Exception;
use Illuminate\Support\Facades\DB;
use EasyTask\Task;
final class IntervalRun Extends EnhanceSafeCheck{
final function __construct(Request $request){
parent::__construct($request);
}
// 定时执行的进程
// 文档:https://gitee.com/392223903/EasyTask
// 安装依赖:composer require easy-task/easy-task
// 启动定时任务:http://192.168.131.129/xxx/public/index.php/api/enhance/interval_run?secret=&task_class=
// 停止所有定时任务(也可以重启服务器,因为设置了php-fpm进程挂掉重启,所以不能杀死单个php-fpm。总之建议重启服务器。):[root@localhost ~]# killall php-fpm
// 已设置每40s运行api_url接口一次
// 此文件会被缓存起来,若使用其他可变的函数,请移步IntervalFunc.php定义
final function interval_run(Request $request){
$secret = $request->input('secret'); // 开启密钥
$task_class = $request->input('task_class'); // 任务类型
if ($secret != date('Ymd')){
print_r([
'class'=> $task_class,
'key'=> $secret,
'msg'=> '参数不全,不能开启自动任务',
]);
exit();
}else{
$api_url = config_api_url()['api_url'].'enhance/interval_func?task_info=auto_task@xxx@'.date('YmdHis').'@easy_task&task_class='.$task_class;
$task = new Task(); //初始化
$task->setDaemon(false); // 设置非常驻内存
$task->setTimeZone('Asia/Shanghai'); // 设置系统时区
$task->setAutoRecover(true); // 设置子进程挂掉自动重启
$task->setPrefix('EasyTask-IntervalRun'); // 设置项目名称
$task->setRunTimePath(path_info()['storage_path']."/interval_run/"); // 设置记录运行时目录(日志或缓存目录)
// 添加闭包函数类型定时任务(每隔x秒执行n次你写闭包方法中的代码)
$task->addFunc(function () use ($api_url){ // use()是使用父级参数
// 其他定时操作
// 请求接口
request_option($api_url, 'get', [], false);
}, 'request', 40, 1); // time:s,used:开启N个进程
$task->start(); // 启动任务
}
}
}
如下:定时分发任务的函数:
<?php
namespace App\Http\Controllers\Enhance;
use App\Http\Controllers\Enhance\Log;
use App\Http\Controllers\EnhanceSafeCheck;
use Illuminate\Http\Request;
use Exception;
use Illuminate\Support\Facades\DB;
final class IntervalFunc Extends EnhanceSafeCheck{
final function __construct(Request $request){
parent::__construct($request);
}
// test
public function func_test($task_class){
$log = new Log();
$info = [
'func_test'=> '测试定期器任务分发',
'task_class'=> $task_class,
];
$log->write_log('WebSafeCheck debug_key', $info);
}
// 定时器启动后执行其他操作
final function interval_func(Request $request){
$task_info = $request->input('task_info');
$task_class = $request->input('task_class');
// 分发任务
if ($task_class == 'test'){
$this->func_test($task_class);
}else {
$task_info = 'Msg-task_class-unknown';
}
// 记录运行日志
$data = [
'api'=> 'interval_func',
'param'=> $task_info,
'create_time'=> date('YmdHis'),
'remark'=> '定记-'.$task_class,
];
$interval_run_id = DB::table('interval_run')->insertGetId($data);
// 删除老数据
$now_time = date('YmdHis');
$last_time = $now_time - 8*60*60; // s。设置日志保存8天
$res_del = DB::table('interval_run')
->where('create_time', '<', $last_time)
->delete();
$back = [
'state'=> 1, // 只能取值0或1
'msg'=> '运行完成',
'content'=> [$task_info, $task_class, $interval_run_id, $res_del],
];
return array_to_json($back);
}
}
如下,数据库记录运行的记录:
如下,日志文件记录:
-
-