コード例 #1
0
ファイル: Timer.php プロジェクト: myweishanli/yii2-workerman
 /**
  * Add a timer.
  *
  * @param int      $time_interval
  * @param callback $func
  * @param mixed    $args
  * @param bool     $persistent
  * @return bool
  */
 public static function add($time_interval, $func, $args = array(), $persistent = true)
 {
     if ($time_interval <= 0) {
         echo new Exception("bad time_interval");
         return false;
     }
     if (self::$_event) {
         return self::$_event->add($time_interval, $persistent ? EventInterface::EV_TIMER : EventInterface::EV_TIMER_ONCE, $func, $args);
     }
     if (!is_callable($func)) {
         echo new Exception("not callable");
         return false;
     }
     if (empty(self::$_tasks)) {
         pcntl_alarm(1);
     }
     $time_now = time();
     $run_time = $time_now + $time_interval;
     if (!isset(self::$_tasks[$run_time])) {
         self::$_tasks[$run_time] = array();
     }
     self::$_tasks[$run_time][] = array($func, (array) $args, $persistent, $time_interval);
     return true;
 }
コード例 #2
0
ファイル: Worker.php プロジェクト: myweishanli/yii2-workerman
 /**
  * Run worker instance.
  *
  * @return void
  */
 public function run()
 {
     //Update process state.
     self::$_status = self::STATUS_RUNNING;
     // Eegister shutdown function for checking errors.
     register_shutdown_function(array("\\wsl\\workerman\\Worker", 'checkErrors'));
     // Set autoload root path.
     Autoloader::setRootPath($this->_autoloadRootPath);
     // Create a global event loop.
     if (!self::$globalEvent) {
         $eventLoopClass = "\\wsl\\workerman\\Events\\" . ucfirst(self::getEventLoopName());
         self::$globalEvent = new $eventLoopClass();
         // Register a listener to be notified when server socket is ready to read.
         if ($this->_socketName) {
             if ($this->transport !== 'udp') {
                 self::$globalEvent->add($this->_mainSocket, EventInterface::EV_READ, array($this, 'acceptConnection'));
             } else {
                 self::$globalEvent->add($this->_mainSocket, EventInterface::EV_READ, array($this, 'acceptUdpConnection'));
             }
         }
     }
     // Reinstall signal.
     self::reinstallSignal();
     // Init Timer.
     Timer::init(self::$globalEvent);
     // Try to emit onWorkerStart callback.
     if ($this->onWorkerStart) {
         try {
             call_user_func($this->onWorkerStart, $this);
         } catch (\Exception $e) {
             echo $e;
             exit(250);
         } catch (\Error $e) {
             echo $e;
             exit(250);
         }
     }
     // Main loop.
     self::$globalEvent->loop();
 }