Skip to content

Commit

Permalink
Crontab优化
Browse files Browse the repository at this point in the history
  • Loading branch information
kiss291323003 committed Dec 22, 2020
1 parent 340bcab commit 2790e6a
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 25 deletions.
47 changes: 23 additions & 24 deletions src/Crontab/CronRunner.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,53 +23,52 @@ public function run($arg)
$tasks = $arg;
/** @var Table $table */
$table = Crontab::getInstance()->infoTable();
/*
* 先清空一遍规则
*/
//先清空一遍规则,禁止循环的时候删除key
$keys = [];
foreach ($table as $key => $value) {
$keys[] = $key;
}
foreach ($keys as $key){
$table->del($key);
}
//这部分的解析,迁移到Crontab.php做
foreach ($tasks as $taskName => $cronTaskClass) {
/**
* @var $cronTaskClass AbstractCronTask
*/
/** @ @var $cronTaskClass AbstractCronTask */
$taskName = $cronTaskClass::getTaskName();
$taskRule = $cronTaskClass::getRule();
$nextTime = CronExpression::factory($taskRule)->getNextRunDate()->getTimestamp();
$table->set($taskName, ['taskRule' => $taskRule, 'taskRunTimes' => 0, 'taskNextRunTime' => $nextTime, 'isStop' => 0]);
$table->set($taskName, ['taskRule' => $taskRule, 'taskRunTimes' => 0, 'taskNextRunTime' => $nextTime, 'currentRunTime'=>0,'isStop' => 0]);
$this->tasks[$taskName] = $cronTaskClass;
}
$this->cronProcess();
Timer::getInstance()->loop(29 * 1000, function () {
//60无法被8整除。
Timer::getInstance()->loop(8 * 1000, function () {
$this->cronProcess();
});
}

public function onShutDown()
{
// TODO: Implement onShutDown() method.
}

private function cronProcess()
{
$table = Crontab::getInstance()->infoTable();
foreach ($table as $taskName => $task) {
if ($task['isStop']) {
continue;
}
$taskRule = $task['taskRule'];
$nextRunTime = CronExpression::factory($task['taskRule'])->getNextRunDate();
$distanceTime = $nextRunTime->getTimestamp() - time();
if ($distanceTime < 30) {
Timer::getInstance()->after($distanceTime * 1000, function () use ($taskName, $taskRule) {
$table = Crontab::getInstance()->infoTable();
$nextRunTime = CronExpression::factory($taskRule)->getNextRunDate();
$table->incr($taskName, 'taskRunTimes', 1);
$table->set($taskName, ['taskNextRunTime' => $nextRunTime->getTimestamp()]);
TaskManager::getInstance()->async($this->tasks[$taskName]);
});
$nextRunTime = CronExpression::factory($task['taskRule'])->getNextRunDate()->getTimestamp();
if($task['taskNextRunTime'] != $nextRunTime){
$table->set($taskName,['taskNextRunTime'=>$nextRunTime]);
}
if(($nextRunTime == $task['taskNextRunTime']) && $nextRunTime == $task['currentRunTime']){
//本轮已经创建过任务
continue;
}
$table->set($taskName,['currentRunTime'=>$nextRunTime]);
$distanceTime = $nextRunTime- time();
Timer::getInstance()->after($distanceTime * 1000, function () use ($taskName) {
$table = Crontab::getInstance()->infoTable();
$table->incr($taskName, 'taskRunTimes', 1);
TaskManager::getInstance()->async($this->tasks[$taskName]);
});
}
}
}
3 changes: 2 additions & 1 deletion src/Crontab/Crontab.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ function __construct()
$this->table = new Table(1024);
$this->table->column('taskRule', Table::TYPE_STRING, 35);
$this->table->column('taskRunTimes', Table::TYPE_INT, 8);
$this->table->column('taskNextRunTime', Table::TYPE_INT, 8);
$this->table->column('taskNextRunTime', Table::TYPE_INT, 10);
$this->table->column('currentRunTime', Table::TYPE_INT, 10);
$this->table->column('isStop', Table::TYPE_INT, 1);
$this->table->create();
}
Expand Down

0 comments on commit 2790e6a

Please sign in to comment.