Использование libevent

Для реализации сервера на PHP удобно использовать libevent в качестве средства для уведомления о событиях с дескрипторами сокетов. Для использования libevent из PHP достаточно выполнить команду:

pecl install libevent

Затем добавить libevent.so в php.ini.

Вот пример простого сервера на PHP.

<?php

class Server
{
	private $base = NULL;
	private $event = NULL;
	private $id = 0;
	private $connections = array();
	private $buffers = array();
	
	public function __construct() {
		$this->base = event_base_new();
		$this->event = event_new();
		
		$errno = 0;
		$errstr = '';
		$socket = stream_socket_server('tcp://0.0.0.0:5269', $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);
	}
	
	public function accept($socket, $flag, $base) {
		$this->id ++;
		$connection = stream_socket_accept($socket);
		stream_set_blocking($connection, 0);
		$buffer = event_buffer_new($connection, array($this, 'onRead'), NULL, array($this, 'onError'), $this->id);
		event_buffer_base_set($buffer, $this->base);
		event_buffer_timeout_set($buffer, 30, 30);
		event_buffer_watermark_set($buffer, EV_READ, 0, 0xffffff);
		event_buffer_priority_set($buffer, 10);
		event_buffer_enable($buffer, EV_READ | EV_PERSIST);
		$this->connections[$this->id] = $connection;
		$this->buffers[$this->id] = $buffer;
	}
	
	private function onError($buffer, $error, $id) {
		event_buffer_disable($this->buffers[$id], EV_READ | EV_WRITE);
		event_buffer_free($this->buffers[$id]);
		fclose($this->connections[$id]);
		unset($this->buffers[$id], $this->connections[$id]);
	}

	private function onRead($buffer, $id) {
		while($read = event_buffer_read($buffer, 256)) {
			var_dump($read);
		}
	}
	
	public function execute() {
		event_base_loop($this->base);
	}
}

$server = new Server();
$server->execute();

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>