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