Files
dafuweng-saiadmin6.x/server/plugin/saiadmin/process/Task.php

74 lines
2.9 KiB
PHP

<?php
// +----------------------------------------------------------------------
// | saiadmin [ saiadmin快速开发框架 ]
// +----------------------------------------------------------------------
// | Author: sai <1430792918@qq.com>
// +----------------------------------------------------------------------
namespace plugin\saiadmin\process;
use plugin\saiadmin\app\logic\tool\CrontabLogic;
use Webman\Channel\Client;
use Workerman\Crontab\Crontab;
class Task
{
protected $logic; //login对象
public $crontabIds = []; //定时任务表主键id => Crontab对象id
public function __construct()
{
$dbName = env('DB_NAME');
if (!empty($dbName)) {
$this->logic = new CrontabLogic();
$channelHost = env('WEBMAN_CHANNEL_HOST', '127.0.0.1');
$channelPort = filter_var(env('WEBMAN_CHANNEL_PORT'), FILTER_VALIDATE_INT);
if ($channelPort === false) {
$channelPort = 2207;
}
// 连接webman channel服务
Client::connect($channelHost, $channelPort);
// 订阅某个自定义事件并注册回调,收到事件后会自动触发此回调
Client::on('crontab', function ($data) {
$this->reload($data);
});
}
}
public function onWorkerStart()
{
$dbName = env('DB_NAME');
if (!empty($dbName)) {
$this->initStart();
}
}
public function initStart()
{
$logic = new CrontabLogic();
$taskList = $logic->getAll($logic->search(['status' => 1]));
foreach ($taskList as $item) {
$crontab = new Crontab($item['rule'], function () use ($item) {
$this->logic->run($item['id']);
});
$this->crontabIds[intval($item['id'])] = $crontab->getId(); //存储定时任务表主键id => Crontab对象id
echo PHP_EOL . date('Y-m-d H:i:s') . " => 定时任务[" . $item['id'] . "][" . $item['name'] . "]:启动成功" . PHP_EOL;
}
}
public function reload($data)
{
$id = intval($data['args'] ?? 0); //定时任务表主键id
if (isset($this->crontabIds[$id])) {
Crontab::remove($this->crontabIds[$id]);
unset($this->crontabIds[$id]); //删除定时任务表主键id => Crontab对象id
echo PHP_EOL . date('Y-m-d H:i:s') . " => 定时任务[" . $id . "]:移除成功" . PHP_EOL;
}
$item = $this->logic->read($id);// 查询定时任务表数据
if ($item && $item['status'] == 1) {
$crontab = new Crontab($item['rule'], function () use ($item) {
$this->logic->run($item['id']);
});
$this->crontabIds[$id] = $crontab->getId(); //存储定时任务表主键id => Crontab对象id
echo PHP_EOL . date('Y-m-d H:i:s') . " => 定时任务[" . $item['id'] . "][" . $item['name'] . "]:启动成功" . PHP_EOL;
}
}
}