| <?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()); | 
|             } | 
|         } | 
|     } | 
| } |