示例#1
0
 public function running()
 {
     Signal::getInstance()->dispatch();
     return $this->running_;
 }
示例#2
0
 public function run($conf)
 {
     $groups = [];
     foreach ($conf['groups'] as $group_conf) {
         $group = [];
         if (isset($group_conf['proxy'])) {
             $proxy_conf = $group_conf['proxy'];
             $proxy_pool = new Pool();
             $proxy_pool->start(1, $proxy_conf['routine']);
             $group['proxy'] = $proxy_pool;
         }
         if (isset($group_conf['worker'])) {
             $worker_conf = $group_conf['worker'];
             $worker_pool = new Pool();
             $worker_pool->start($worker_conf['num'], $worker_conf['routine']);
             $group['worker'] = $worker_pool;
         }
         $groups[] = $group;
     }
     sleep(1);
     $bootstrap_success = true;
     foreach ($groups as $group) {
         foreach ($group as $pool) {
             $pool->waitAll();
             if ($pool->getWorkersDied() > 0) {
                 $bootstrap_success = false;
                 break;
             }
         }
     }
     if ($bootstrap_success) {
         $loop = Loop::getInstance();
         $loop->start();
         $restarting_workers = false;
         Signal::getInstance()->on(SIGUSR1, function () use(&$restarting_workers) {
             $restarting_workers = true;
         });
         while ($loop->running()) {
             if ($restarting_workers) {
                 foreach ($groups as $group) {
                     if (isset($group['worker'])) {
                         $group['worker']->killAll(SIGTERM);
                     }
                 }
                 $restarting_workers = false;
             }
             foreach ($groups as $group) {
                 foreach ($group as $pool) {
                     $pool->keep();
                 }
             }
             usleep(40000);
         }
     } else {
         \ServerBench\syslog_error('failed to bootstrap workers in controller.');
     }
     foreach ($groups as $group) {
         foreach ($group as $pool) {
             $pool->terminate();
         }
     }
 }