/** * Start a process built with \Happen\Emmiters. * * This will block till the event loop is stopped, so should always be the last * call in your script (unless you pass flags to $ev_flags, but that's up to you). * * @param callable $callable The 'main' function to begin the process with. If omitted, it will call 'main'. * @param integer $ev_flags Run flags to pass to \Ev::run(). * @return integer The exit code. */ public static function run($callable = null, $ev_flags = 0) { // Wrap our callable. $callable = new Callback($callable ?: 'main'); // Make our callable run when the event loop kicks off. $_ = new \EvTimer(0, 0, function () use($callable) { $callable(); }); // Run the event loop. \Ev::run($ev_flags); // Event loop stopped gracefully, all done! return 0; }
/** * start crontab and loop */ public function start() { $this->logger->info("crontab start"); $crontab = new Crontab($this->crontab_config, $this->logger); $timer = new \EvPeriodic(0.0, 60.0, null, function ($timer, $revents) use($crontab) { $pid = pcntl_fork(); if ($pid > 0) { return; } elseif ($pid == 0) { $crontab->start(time()); exit; } else { $this->logger->error("could not fork"); exit; } }); $child = new \EvChild(0, false, function ($child, $revents) { pcntl_waitpid($child->rpid, $status); $message = "process exit. pid:" . $child->rpid . ". exit code:" . $child->rstatus; $this->logger->info($message); }); \Ev::run(); $this->logger->info("crontab exit"); }
}); // Create and launch timer firing after 2 seconds repeating each second // until we manually stop it $w2 = new EvTimer(2, 1, function ($w) { echo "is called every second, is launched after 2 seconds\n"; echo "iteration = ", Ev::iteration(), PHP_EOL; // Stop the watcher after 5 iterations Ev::iteration() == 5 and $w->stop(); // Stop the watcher if further calls cause more than 10 iterations Ev::iteration() >= 10 and $w->stop(); }); // Create stopped timer. It will be inactive until we start it ourselves $w_stopped = EvTimer::createStopped(10, 5, function ($w) { echo "Callback of a timer created as stopped\n"; // Stop the watcher after 2 iterations Ev::iteration() >= 2 and $w->stop(); }); // Loop until Ev::stop() is called or all of watchers stop Ev::run(); // Start and look if it works $w_stopped->start(); echo "Run single iteration\n"; Ev::run(Ev::RUN_ONCE); echo "Restart the second watcher and try to handle the same events, but don't block\n"; $w2->again(); Ev::run(Ev::RUN_NOWAIT); $w = new EvTimer(10, 0, function () { }); echo "Running a blocking loop\n"; Ev::run(); echo "END\n";
/** * 事件循环 * @see EventInterface::loop() */ public function loop() { \Ev::run(); }
/** * @param int $mode */ public function run($mode = \Ev::FLAG_AUTO) { $this->logger->notice('Starting event loop.'); \Ev::run($mode); }
public function run($useExternalEventLoop = false) { if (true === $useExternalEventLoop) { // Advertise the library we want to control the event loop echo "Declaring external event loop…\n"; $loop = new EventLoop($this); $this->server->setEventLoop($loop); } // Open main socket $this->server->run(); if (true === $useExternalEventLoop) { // Main advantage of external event loop : you can manage other events // Example : $tick = new \EvTimer(0, 1, [$this, 'evTick1s']); \Ev::run(); } }