コード例 #1
0
ファイル: Worker.php プロジェクト: lisonglin0129/LDFRAMEWORK
 /**
  * 执行平滑重启流程
  * @return void
  */
 protected static function reload()
 {
     // 主进程部分
     if (self::$_masterPid === posix_getpid()) {
         // 设置为平滑重启状态
         if (self::$_status !== self::STATUS_RELOADING && self::$_status !== self::STATUS_SHUTDOWN) {
             self::log("Workerman[" . basename(self::$_startFile) . "] reloading");
             self::$_status = self::STATUS_RELOADING;
         }
         // 如果有worker设置了reloadable=false,则过滤掉
         $reloadable_pid_array = array();
         foreach (self::$_pidMap as $worker_id => $worker_pid_array) {
             $worker = self::$_workers[$worker_id];
             if ($worker->reloadable) {
                 foreach ($worker_pid_array as $pid) {
                     $reloadable_pid_array[$pid] = $pid;
                 }
             } else {
                 foreach ($worker_pid_array as $pid) {
                     // 给reloadable=false的进程也发送一个reload信号,触发onWorkerReload
                     posix_kill($pid, SIGUSR1);
                 }
             }
         }
         // 得到所有可以重启的进程
         self::$_pidsToRestart = array_intersect(self::$_pidsToRestart, $reloadable_pid_array);
         // 平滑重启完毕
         if (empty(self::$_pidsToRestart)) {
             if (self::$_status !== self::STATUS_SHUTDOWN) {
                 self::$_status = self::STATUS_RUNNING;
             }
             return;
         }
         // 继续执行平滑重启流程
         $one_worker_pid = current(self::$_pidsToRestart);
         // 给子进程发送平滑重启信号
         posix_kill($one_worker_pid, SIGUSR1);
         // 定时器,如果子进程在KILL_WORKER_TIMER_TIME秒后没有退出,则强行杀死
         Timer::add(self::KILL_WORKER_TIMER_TIME, 'posix_kill', array($one_worker_pid, SIGKILL), false);
     } else {
         // 如果当前worker的reloadable属性为真,则执行退出
         $worker = current(self::$_workers);
         // 如果有设置Reload回调,则执行
         if ($worker->onWorkerReload) {
             call_user_func($worker->onWorkerReload, $worker);
         }
         if ($worker->reloadable) {
             self::stopAll();
         }
     }
 }