예제 #1
0
파일: EVLoop.php 프로젝트: jxw7733/zphpdemo
 public function __construct()
 {
     $this->base = event_base_new();
     $this->callback = $this->createLibeventCallback();
     $this->timersGc = new \SplQueue();
     $this->timersGc->setIteratorMode(\SplQueue::IT_MODE_DELETE);
 }
예제 #2
0
 public function __construct()
 {
     // @codeCoverageIgnoreStart
     if (!\extension_loaded("libevent")) {
         throw new \RuntimeException("The pecl libevent extension is required to use " . __CLASS__);
     }
     // @codeCoverageIgnoreEnd
     $this->base = \event_base_new();
     $this->keepAliveBase = \event_base_new();
     /**
      * Prior to PHP7 we can't cancel closure watchers inside their own callbacks
      * because PHP will fatal. In legacy versions we schedule manual GC workarounds.
      *
      * @link https://bugs.php.net/bug.php?id=62452
      */
     if (PHP_MAJOR_VERSION < 7) {
         $this->gcEvent = event_new();
         \event_timer_set($this->gcEvent, function () {
             $this->garbage = [];
             $this->isGcScheduled = false;
             \event_del($this->gcEvent);
         });
         \event_base_set($this->gcEvent, $this->keepAliveBase);
     }
     $this->onCoroutineResolution = function ($e = null, $r = null) {
         if ($e) {
             $this->onCallbackError($e);
         }
     };
 }
예제 #3
0
 /**
  * Construct new event base
  *
  * @see event_base_new
  * @link http://www.php.net/manual/function.event-base-new.php
  * @param int $priority
  * @throws EventException
  */
 public function __construct($priority = self::DEFAULT_PRIORITY)
 {
     if (false === ($this->resource = event_base_new())) {
         throw $this->exception('Could not create event base resourse (event_base_new).');
     }
     $this->setPriority($priority);
 }
예제 #4
0
 function EpollSocketServer($port)
 {
     global $errno, $errstr;
     if (!extension_loaded('libevent')) {
         die("Please install libevent extension firstly/n");
     }
     if ($port < 1024) {
         die("Port must be a number which bigger than 1024/n");
     }
     $socket_server = stream_socket_server("tcp://0.0.0.0:{$port}", $errno, $errstr);
     if (!$socket_server) {
         die("{$errstr} ({$errno})");
     }
     stream_set_blocking($socket_server, 0);
     // 非阻塞
     $base = event_base_new();
     $event = event_new();
     event_set($event, $socket_server, EV_READ | EV_PERSIST, array(__CLASS__, 'ev_accept'), $base);
     event_base_set($event, $base);
     event_add($event);
     event_base_loop($base);
     self::$connections = array();
     self::$buffers = array();
     self::$imei = array();
 }
예제 #5
0
 /**
  * Creates the main event loop
  *
  * @param int $priorities The number of different priorities
  */
 public function __construct($priorities = null)
 {
     $this->resource = event_base_new();
     if (!is_null($priorities)) {
         event_base_priority_init($this->resource, $priorities);
     }
 }
예제 #6
0
 public static function getBase()
 {
     if (!self::$globalBase) {
         self::$globalBase = event_base_new();
     }
     return self::$globalBase;
 }
예제 #7
0
 public function __construct($addr = '127.0.0.1', $port = 8305, $listenQueue = 512)
 {
     if (is_null(self::$_logger)) {
         self::$_logger = \Zopt\Base\Logger::getLogger(__CLASS__);
     }
     if (!extension_loaded('libevent')) {
         self::$_logger->crit('FATAL: Please firstly install libevent extension.');
         die;
     }
     $this->_addr = $addr;
     $this->_port = $port;
     $this->_listenQueue = $listenQueue;
     $this->_started = FALSE;
     $this->_sock = NULL;
     // Init the event machine using libevent c extension
     $this->_listenEvent = NULL;
     $this->_eventBase = event_base_new();
     $this->_streams = array();
     // Register signal handlers
     $this->_signalEvents = array();
     foreach (array(SIGTERM, SIGHUP, SIGINT, SIGQUIT) as $signo) {
         $event = event_new();
         event_set($event, $signo, EV_SIGNAL | EV_PERSIST, array($this, 'handleSignalEvent'), $signo);
         event_base_set($event, $this->_eventBase);
         event_add($event);
         $this->_signalEvents[$signo] = $event;
     }
 }
 public function __construct($port)
 {
     global $errno, $errstr;
     if (!extension_loaded('libevent')) {
         die("Please install libevent extension firstly\n");
     }
     if ($port < 1024) {
         die("Port must be a number which bigger than 1024\n");
     }
     $socket_server = stream_socket_server("tcp://0.0.0.0:{$port}", $errno, $errstr);
     if (!$socket_server) {
         die("{$errstr} ({$errno})");
     }
     stream_set_blocking($socket_server, 0);
     // 非阻塞
     // event_base_new — Create and initialize new event base
     $base = event_base_new();
     // event_new — Create new event
     $event = event_new();
     // event_set — Prepare an event
     event_set($event, $socket_server, EV_READ | EV_PERSIST, [__CLASS__, 'ev_accept'], $base);
     // event_base_set — Associate event base with an event
     event_base_set($event, $base);
     // event_add — Add an event to the set of monitored events
     event_add($event);
     // event_base_loop — Handle events
     event_base_loop($base);
     self::$connections = [];
     self::$buffers = [];
 }
예제 #9
0
 public function start()
 {
     $this->onStart();
     $this->base = event_base_new();
     if ($this->_server) {
         $this->event = event_new();
         event_set($this->event, $this->_server, EV_READ | EV_PERSIST, array($this, 'accept'), $this->base);
         event_base_set($this->event, $this->base);
         event_add($this->event);
     }
     if ($this->_service) {
         $this->service_event = event_new();
         event_set($this->service_event, $this->_service, EV_READ | EV_PERSIST, array($this, 'service'), $this->base);
         event_base_set($this->service_event, $this->base);
         event_add($this->service_event);
     }
     if ($this->_master) {
         $this->master_event = event_new();
         event_set($this->master_event, $this->_master, EV_READ | EV_PERSIST | EV_WRITE, array($this, 'master'), $this->base);
         event_base_set($this->master_event, $this->base);
         event_add($this->master_event);
     }
     if ($this->timer) {
         $timer = event_timer_new();
         event_timer_set($timer, array($this, '_onTimer'), $timer);
         event_base_set($timer, $this->base);
         //event_timer_pending($timer, $this->timer * 1000000);
         event_timer_add($timer, $this->timer * 1000000);
     }
     event_base_loop($this->base);
 }
 public function start()
 {
     $this->base = event_base_new();
     if ($this->_server) {
         $this->event = event_new();
         event_set($this->event, $this->_server, EV_READ | EV_PERSIST, array($this, 'accept'), $this->base);
         event_base_set($this->event, $this->base);
         event_add($this->event);
     }
     foreach ($this->_services as $serviceId => $service) {
         $event = event_new();
         event_set($event, $service, EV_READ | EV_PERSIST | EV_WRITE, array($this, 'service'), $this->base);
         event_base_set($event, $this->base);
         event_add($event);
         $this->events[$serviceId] = $event;
     }
     if ($this->timer) {
         $timer = event_timer_new();
         event_timer_set($timer, array($this, '_onTimer'), $timer);
         event_base_set($timer, $this->base);
         //event_timer_pending($timer, $this->timer * 1000000);
         event_timer_add($timer, $this->timer * 1000000);
     }
     event_base_loop($this->base);
 }
예제 #11
0
 /**
  * LeBase constructor.
  */
 public function __construct()
 {
     $this->handle = event_base_new();
     if ($this->handle === false) {
         throw new \RuntimeException('Can not initialize libevent.');
     }
 }
예제 #12
0
 /**
  * Normally this would go into the __construct() function but it's split out into its own
  * method because we also have to initialize() when calling afterFork().
  */
 private function initialize()
 {
     $this->base = event_base_new();
     $this->gcEvent = event_new();
     event_timer_set($this->gcEvent, [$this, 'collectGarbage']);
     event_base_set($this->gcEvent, $this->base);
 }
예제 #13
0
 /**
  * Runtime of Master process
  * @return void
  */
 public function run()
 {
     Daemon::$process = $this;
     $this->prepareSystemEnv();
     class_exists('Timer');
     // ensure loading this class
     gc_enable();
     $this->eventBase = event_base_new();
     $this->registerEventSignals();
     FS::initEvent();
     $this->fileWatcher = new FileWatcher();
     $this->workers = new ThreadCollection();
     $this->collections['workers'] = $this->workers;
     Daemon::$appResolver = (require Daemon::$config->path->value);
     $this->IPCManager = Daemon::$appResolver->getInstanceByAppName('IPCManager');
     Daemon::$appResolver->preload(true);
     $this->callbacks = new SplStack();
     $this->spawnWorkers(min(Daemon::$config->startworkers->value, Daemon::$config->maxworkers->value));
     Timer::add(function ($event) use(&$cbs) {
         $self = Daemon::$process;
         static $c = 0;
         ++$c;
         if ($c > 0xfffff) {
             $c = 1;
         }
         if ($c % 10 == 0) {
             $self->workers->removeTerminated(true);
             gc_collect_cycles();
         } else {
             $self->workers->removeTerminated();
         }
         if (isset(Daemon::$config->mpm->value) && is_callable(Daemon::$config->mpm->value)) {
             call_user_func(Daemon::$config->mpm->value);
         } else {
             // default MPM
             $state = Daemon::getStateOfWorkers($self);
             if ($state) {
                 $n = max(min(Daemon::$config->minspareworkers->value - $state['idle'], Daemon::$config->maxworkers->value - $state['alive']), Daemon::$config->minworkers->value - $state['alive']);
                 if ($n > 0) {
                     Daemon::log('Spawning ' . $n . ' worker(s).');
                     $self->spawnWorkers($n);
                     event_base_loopbreak($self->eventBase);
                 }
                 $n = min($state['idle'] - Daemon::$config->maxspareworkers->value, $state['alive'] - Daemon::$config->minworkers->value);
                 if ($n > 0) {
                     Daemon::log('Stopping ' . $n . ' worker(s).');
                     $self->stopWorkers($n);
                 }
             }
         }
         $event->timeout();
     }, 1000000.0 * Daemon::$config->mpmdelay->value, 'MPM');
     while (!$this->breakMainLoop) {
         while (!$this->callbacks->isEmpty()) {
             call_user_func($this->callbacks->shift(), $this);
         }
         event_base_loop($this->eventBase);
     }
 }
 public function loop()
 {
     if (!($this->event_base = event_base_new())) {
         throw new RuntimeException("Can't create event base");
     }
     $this->addSocketEvent();
     event_base_loop($this->event_base);
 }
예제 #15
0
파일: LibEventLoop.php 프로젝트: nrk/react
 public function __construct()
 {
     $this->eventBase = event_base_new();
     $this->nextTickQueue = new NextTickQueue($this);
     $this->timerEvents = new SplObjectStorage();
     $this->createTimerCallback();
     $this->createStreamCallback();
 }
예제 #16
0
 public function worker_callback(swoole_process $worker)
 {
     self::$worker_event_base[$worker->pipe] = event_base_new();
     $event = event_new();
     //$GLOBALS['worker'] = $worker;
     event_set($event, $worker->pipe, EV_READ | EV_PERSIST, array($this, 'worker_accept'), $worker);
     event_base_set($event, self::$worker_event_base[$worker->pipe]);
     event_add($event);
     event_base_loop(self::$worker_event_base[$worker->pipe]);
 }
예제 #17
0
 public function loop()
 {
     if (!($this->event_base = event_base_new())) {
         throw new RuntimeException("Can't create event base");
     }
     foreach ($this->addrs as $addr) {
         $this->addAddr($addr);
     }
     event_base_loop($this->event_base);
 }
 public function listen()
 {
     echo "Start listening port " . $this->opts['port'] . "\n";
     $socket = stream_socket_server('tcp://0.0.0.0:' . $this->opts['port'], $errno, $errstr);
     stream_set_blocking($socket, 0);
     $this->base = event_base_new();
     $listenerEvent = event_new();
     event_set($listenerEvent, $socket, EV_READ | EV_PERSIST, array($this, 'onAccept'), null);
     event_base_set($listenerEvent, $this->base);
     event_add($listenerEvent, -1);
     event_base_loop($this->base);
 }
 /**
  * Start listening
  */
 public function listen()
 {
     $this->handle_ = stream_socket_server("tcp://{$this->host_}:{$this->port_}", $this->errno_, $this->errstr_);
     stream_set_blocking($this->handle_, 0);
     // no blocking
     $this->base_ = \event_base_new();
     $this->serverEvent_ = \event_new();
     \event_set($this->serverEvent_, $this->handle_, EV_READ | EV_PERSIST, array($this, 'onConnect'));
     \event_base_set($this->serverEvent_, $this->base_);
     \event_add($this->serverEvent_);
     \event_base_loop($this->base_);
 }
예제 #20
0
 public function __construct($address, $port)
 {
     $this->base = event_base_new();
     $this->event = event_new();
     Logger::getInstance()->outString("Create new socket for " . $address . ":" . $port);
     $errno = 0;
     $errstr = '';
     $socket = stream_socket_server('tcp://' . $address . ':' . $port, $errno, $errstr);
     stream_set_blocking($socket, 0);
     event_set($this->event, $socket, EV_READ | EV_PERSIST, array($this, 'accept'), $this->base);
     event_base_set($this->event, $this->base);
     event_add($this->event);
     $this->onLoad();
 }
예제 #21
0
 public function __construct(RedisJobQueue $parent, $prefix, $file, $limit = 4)
 {
     $this->parent = $parent;
     $this->prefix = $prefix;
     $this->limit = $limit;
     $script = realpath($file);
     if (!$script) {
         $script = realpath(dirname(realpath(CONFIG_FILE)) . '/' . $file);
     }
     $this->script = $script ? $script : $file;
     if (!function_exists('event_base_new')) {
         $this->log('Warning : You should install libevent as a PHP module');
     } else {
         $this->events = event_base_new();
     }
 }
예제 #22
0
 /**
  * @param bool $enableSignals True to enable signal handling, false to disable.
  * @param \Icicle\Loop\Events\EventFactoryInterface|null $eventFactory
  * @param resource|null Resource created by event_base_new() or null to automatically create an event base.
  *
  * @throws \Icicle\Loop\Exception\UnsupportedError If the libevent extension is not loaded.
  */
 public function __construct($enableSignals = true, EventFactoryInterface $eventFactory = null, $base = null)
 {
     // @codeCoverageIgnoreStart
     if (!self::enabled()) {
         throw new UnsupportedError(__CLASS__ . ' requires the libevent extension.');
     }
     // @codeCoverageIgnoreEnd
     // @codeCoverageIgnoreStart
     if (!is_resource($base)) {
         $this->base = event_base_new();
     } else {
         // @codeCoverageIgnoreEnd
         $this->base = $base;
     }
     parent::__construct($enableSignals, $eventFactory);
 }
예제 #23
0
 public function __construct()
 {
     echo 'USING LIBEVENTLOOP' . PHP_EOL;
     $this->eventBase = event_base_new();
     $this->nextTickQueue = new NextTickQueue($this);
     $this->futureTickQueue = new FutureTickQueue($this);
     $this->timerEvents = new SplObjectStorage();
     $this->createTimerCallback();
     $this->createStreamCallback();
     $this->addTimer($this->nextPoll, function () {
         $this->socketTick();
     });
     $this->addPeriodicTimer(5, function () {
         //KUBE::Log([count($this->readSockets).":".count($this->readSocketListeners),count($this->writeSockets).":".count($this->writeSocketListeners)],'sockets');
         $this->adjustNextPoll();
         gc_collect_cycles();
     });
 }
예제 #24
0
 public function __construct($host = '127.0.0.1', $port = 80)
 {
     ini_set('precision', 50);
     $this->host = $host;
     $this->port = $port;
     $this->clientCount = 0;
     $this->connections = array();
     $this->buffers = array();
     $this->unauthorised = array();
     $this->pool = array();
     $this->i = 0;
     $this->buffer_id = 0;
     $this->event = new Event();
     if (function_exists('event_base_new')) {
         $this->ev_base = event_base_new();
     } else {
         trigger_error("Libevent does not seem to be installed properly on your system/php.See README for more info\n", E_USER_ERROR);
     }
     $this->fds = [];
 }
예제 #25
0
 public function libevent_serverAction()
 {
     function print_line($fd, $events, $arg)
     {
         echo "callback fired" . PHP_EOL;
         var_dump($arg[0]->recv());
         $arg[0]->send("got msg " . ZmqController::$msgs);
         if (ZmqController::$msgs++ >= 10) {
             event_base_loopexit($arg[1]);
         }
     }
     $base = event_base_new();
     $event = event_new();
     $context = new ZMQContext();
     $rep = $context->getSocket(ZMQ::SOCKET_REP);
     $rep->bind("tcp://127.0.0.1:5555");
     $fd = $rep->getSockOpt(ZMQ::SOCKOPT_FD);
     event_set($event, $fd, EV_READ | EV_PERSIST, "print_line", array($rep, $base));
     event_base_set($event, $base);
     event_add($event);
     event_base_loop($base);
 }
예제 #26
0
 function EpollSocketServer($port)
 {
     if (!extension_loaded('libevent')) {
         self::$errstr = "请先安装libevent扩展库。";
         return;
     }
     if ($port < 1024) {
         self::$errstr = "端口号不应小于1024";
         return;
     }
     set_time_limit(0);
     $socket_server = stream_socket_server("tcp://0.0.0.0:{$port}", self::$errno, self::$errstr);
     stream_set_blocking($socket_server, 0);
     // 非阻塞
     $base = event_base_new();
     $event = event_new();
     event_set($event, $socket_server, EV_READ | EV_PERSIST, array(__CLASS__, 'ev_accept'), $base);
     event_base_set($event, $base);
     event_add($event);
     event_base_loop($base);
     self::$connections = array();
     self::$buffers = array();
 }
예제 #27
0
파일: Daemon.php 프로젝트: ansendu/ansio
 public static function init()
 {
     Daemon::$eventBase = event_base_new();
     $args = $_SERVER['argv'];
     if (!isset($args[1]) || !isset($args[2])) {
         Terminal::drawStr('usage: php xxx.php sArea (start|stop|restart|reload|status)' . "\n");
         exit(-1);
     }
     // todo run multi app in one daemon.
     $sArea = $args[1];
     $command = $args[2];
     $appName = Config::get('socket_server_class', null, true);
     Daemon::$runName = $appName;
     $runAppInstance = array($appName => $appName);
     if ($command == 'start') {
         // fork later
         self::$pid = posix_getpid();
         Debug::log('start');
         foreach ($runAppInstance as $appName) {
             $obj = new $appName();
         }
         while (!Daemon::$breakEventLoop) {
             event_base_loop(daemon::$eventBase, EVLOOP_ONCE);
             // 清空本次写状态数组
             gc_collect_cycles();
             //daemon::debug('<== evet_base_loop() ending');
         }
     } elseif ($command == 'stop') {
         // cat pid, stop
     } elseif ($command == 'status') {
         // cat pid, show status
     } elseif ($command == 'restart') {
         //self::stop();
         //self::start();
     }
 }
예제 #28
0
<?php

$base_fd = event_base_new();
$times = 0;
$limit = 10;
$index = array();
function httpGet($host, $base_fd)
{
    global $index;
    $fd = stream_socket_client("{$host}", $errno, $errstr, 3, STREAM_CLIENT_ASYNC_CONNECT | STREAM_CLIENT_CONNECT);
    $index[$fd] = 0;
    $event_fd = event_new();
    event_set($event_fd, $fd, EV_WRITE | EV_PERSIST, function ($fd, $events, $arg) use($host) {
        global $times, $limit, $index;
        if (!$index[$fd]) {
            $index[$fd] = 1;
            $out = "GET / HTTP/1.1\r\n";
            $out .= "Host: {$host}\r\n";
            $out .= "Connection: Close\r\n\r\n";
            fwrite($fd, $out);
        } else {
            $str = fread($fd, 4096);
            echo $str, PHP_EOL;
            if (feof($fd)) {
                fclose($fd);
                $times++;
                echo "done\n";
                if ($times == $limit - 1) {
                    event_base_loopexit($arg[1]);
                }
            }
예제 #29
0
 function init()
 {
     $this->base_event = event_base_new();
     $this->server_event = event_new();
 }
 /**
  * 构造函数
  * @return void
  */
 public function __construct()
 {
     $this->_eventBase = event_base_new();
 }