Exemplo n.º 1
0
 /**
  * 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;
 }
Exemplo n.º 2
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");
 }
Exemplo n.º 3
0
});
// 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";
Exemplo n.º 4
0
 /**
  * 事件循环
  * @see EventInterface::loop()
  */
 public function loop()
 {
     \Ev::run();
 }
Exemplo n.º 5
0
 /**
  * @param int $mode
  */
 public function run($mode = \Ev::FLAG_AUTO)
 {
     $this->logger->notice('Starting event loop.');
     \Ev::run($mode);
 }
Exemplo n.º 6
0
 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();
     }
 }