|
- <?php
- /**
- * 计划任务进程类
- *
- * @author dogstar <chanzonghuang@gmail.com> 20150520
- */
-
- class Task_Progress {
-
- /**
- * @var int MAX_LAST_FIRE_TIME_INTERVAL 修复的最大时间间隔
- */
- const MAX_LAST_FIRE_TIME_INTERVAL = 86400;
-
- /**
- * @var Model_Task_TaskProgress 对数据库的操作
- */
- protected $model;
-
- public function __construct() {
- $this->model = new Model_Task_TaskProgress();
- }
-
- /**
- * 进行进程调度
- *
- * - 1、尝试修复异常的任务
- * - 2、执行全部空闲的任务
- */
- public function run() {
- $this->tryToResetWrongItems();
-
- $this->runAllWaittingItems();
-
- return TRUE;
- }
-
- protected function tryToResetWrongItems() {
- $maxLastFireTime = $_SERVER['REQUEST_TIME'] - self::MAX_LAST_FIRE_TIME_INTERVAL;
-
- $wrongItems = $this->model->getWrongItems($maxLastFireTime);
-
- foreach ($wrongItems as $item) {
- $this->model->resetWrongItems($item['id']);
-
- DI()->logger->debug('task try to reset wrong items', $item);
- }
- }
-
- protected function runAllWaittingItems() {
- $waittingItems = $this->model->getAllWaittingItems();
-
- foreach ($waittingItems as $item) {
- //
- if (!$this->model->isRunnable($item['id'])) {
- continue;
- }
-
- $class = $item['trigger_class'];
- $params = $item['fire_params'];
-
- if (empty($class) || !class_exists($class)) {
- DI()->logger->error('Error: task can not run illegal class', $item);
- $this->model->updateExceptionItem($item['id'], 'task can not run illegal class');
- continue;
- }
-
- $trigger = new $class();
- if (!is_callable(array($class, 'fire'))) {
- DI()->logger->error('Error: task can not call fire()', $item);
- $this->model->updateExceptionItem($item['id'], 'task can not call fire()');
- continue;
- }
-
- $this->model->setRunningState($item['id']);
-
- try {
- $result = call_user_func(array($trigger, 'fire'), $params);
-
- $this->model->updateFinishItem($item['id'], $result);
- } catch (Exception $ex) {
- throw $ex;
- $this->model->updateExceptionItem($item['id'], $ex->getMessage());
- }
- }
- }
- }
|