libevent2

libeventとは
Chromium、Memcachedなどで有名なC言語で作成されたイベント駆動型フレームワークです。

以下の機能などが提供されています。
 ・ネットワーク監視
 ・I/O監視
 ・クライアント・サーバ問い合わせ
 ・HTTPサーバ
 ・SSL
 ・DNS

libeventを使ったサンプルは結構あるのですが、PHPのサンプルが少ないようでした。
PHP5とlibeventを使った、WebSocketのチャットを作成しました。

[github:WebSocket]


libevent2のインストール

$ wget http://jaist.dl.sourceforge.net/project/levent/libevent/libevent-2.0/libevent-2.0.21-stable.tar.gz
$ tar xzvf libevent-2.0.21-stable.tar.gz
$ cd libevent-2.0.21-stable
$ ./configure
$ make
$ sudo make install

php eventモジュールのインストール

$ wget http://pecl.php.net/get/event-1.7.2.tgz
$ tar xzvf event-1.7.2.tgz
$ cd event-1.7.2
$ phpize
$ ./configure
$ make
$ sudo -s
# make install
# cd /etc/php5/mods-available
# echo extension=event.so > event.ini
# cd /etc/php5/conf.d
# ln -s ../mods-available/event.ini ./20-event.ini

phpイベントループ
[php]
<?php
/**
* イベントベースの生成
*/
$base = new EventBase();

/**
* クライアント接続の生成
*/
$listener = new EventListener(
$base,
‘eventCallback’,
$base,
EventListener::OPT_CLOSE_ON_FREE | EventListener::OPT_REUSEABLE,
-1,
‘0.0.0.0:8888’
);

/**
* ループスタート
*/
$base->dispatch();
?>
[/php]


クライアント接続イベント
[php]
<?php
/**
* クライアント接続時コールバック
*/
function eventCallback ($listener, $fd, $address, $base) {
/**
* 遠隔手続呼出処理
*/
$bev = new EventBufferEvent($base, $fd, EventBufferEvent::OPT_CLOSE_ON_FREE);
$bev->setCallbacks(
‘readCallback’,
NULL,
NULL,
NULL
);
}

/**
* クライアント接続時コールバック
*/
function readCallback ($bev, $address) {
static $handshake;

if (empty($handshake)) {
/**
* ハンドシェイクの確立
*/
$buff = $bev->read(4096);
if (preg_match(‘/Sec-WebSocket-Key: ([^\s]+)\r\n/’, $buff, $matches)) {
$key = $matches[1];
}

/* 認証キー生成 */
$accept = $key.’258EAFA5-E914-47DA-95CA-C5AB0DC85B11′;
$accept = base64_encode(sha1($accept, true));

$header = "HTTP/1.1 101 Switching Protocols\r\n".
"Upgrade: WebSocket\r\n".
"Connection: Upgrade\r\n".
"Sec-WebSocket-Accept: {$accept}\r\n".
"\r\n";
$bev->write($header);
$handshake = true;
} else {
$frame = $bev->read(4096);
$msg = ws_decode($frame);
$bev->write(ws_encode($msg));
}
}
?>
[/php]


PHPはC言語のLibraryを簡単に試すことができて便利です。
libeventは大量の作業を効率的に処理できる素晴らしいLibraryです。

あのnode.jsもlibeventを採用しようとしたそうですが、当時はまだlibevent2が
正式版ではなく速度の出るlibevとlibeio採用しているそうです。

※libevent1からlibevent2になり速度が大幅にアップしています。


WebSocketについての解説
uuwan Lab:ハンドシェイクなどの説明
uuwan Lab:Framing Protocolなどの説明
上記のページを参考にさせて頂きました。

Leave a reply