1. 程式人生 > >PHP簡單寫守護程序、多程序

PHP簡單寫守護程序、多程序

    public function actionSupervise($total_process = 1)
    {
        Log::info("%s begins", __METHOD__);
        if (!Mutex::trylock(self::MUTEX_KEY)) {
            Log::info("another supervisor is running.");

            return;
        }

        while (Mutex::isLocked(self::MUTEX_KEY)) {

            for($i
= 0; $i <$total_process ; $i++) { $cmd = sprintf("%s/yiic %s run --total_process=%d --current_process=%d >/dev/null & ", Yii::app()->getBasePath(), self::MUTEX_KEY, $total_process, $i); exec($cmd, $output, $retCode); if ($retCode
!= 0) { Log::error("mq failed: [%d]", $retCode); sleep(self::SLEEP_INTERVAL); } } } Log::info("%s ends", __METHOD__); } public function actionRun($total_process = 1, $current_process = 0) { Log::info
("mq [%s] process %d begin", __METHOD__, $current_process); $mutexKey = self::MUTEX_KEY."_".$current_process; try { if (!Mutex::trylock($mutexKey)) { Log::info(sprintf("another %s is running.",$mutexKey)); return; } $res = $this->runActualOperation($total_process,$current_process); if(empty($res)){ Log::info(sprintf("process %d nothing to running.",$current_process)); } Mutex::unlock($mutexKey); } catch (Exception $ex) { Mutex::unlock($mutexKey); Log::info($ex->getTraceAsString()); } Log::info("mq[%s] process %d end", __METHOD__, $current_process); } public function runActualOperation($total_process,$current_process){ $newMqs = Mq::model()->findNewMqBySlice($total_process, $current_process, self::ITEMS_PER_BATCH); if (count($newMqs) == 0) { sleep(self::SLEEP_INTERVAL); return; } foreach ($newMqs as $mq) { Log::trace("開始處理mq:{$mq->id}"); $this->handleExecute($mq); } }