背景
私はコメントで多くの批判を得るためにベンチャーしています。 しかし、私が最近書き終えた拡張機能について人々がどう思うか知りたいと思っています。 おそらく誰かがテストし、拡張機能が「ベータ版」になります。
libeioライブラリへのインターフェースを提供するPECL eio拡張について話しています。
リベイオ
念のため、libeioについて簡単に説明します。 これは、個別のスレッドでシステムコール(主にPOSIX)を起動するCライブラリです。 ライブラリの目的は、ライブラリの作成者であるM. Lehmanが次のように書いているように、ゲームサーバーで役立つ完全にノンブロッキングのソフトウェアです
「...ゲームサーバーでは、サーバーがバックアップを実行していて、readdirを呼び出しているという理由だけで、数秒間フリーズしたくないでしょう。」
つまり open、read、write、close、readahead、truncate、rename、sendfile、statvfsなどの呼び出し libeioでは、個別のスレッドで実行されます。
libeioのドキュメントは、Windowsを直接拒否しません。 ライブラリに対応する呼び出しがない場合、libeioはこの呼び出しをエミュレートすると書かれています。 ただし、ソースコードには、Windowsでコードを(通常の方法で)コンパイルするものはほとんどありません。 著者はWindowsのサポートを考えていたが、その後この考えを放棄したと感じています。
Eio拡張
拡張機能はlibeioを呼び出します。 libeioの一連の呼び出しを開始するには、eio_poll()を周期的に呼び出す必要があります。 このため、同じ名前の関数がPHPにエクスポートされています。 さらに、イベントループはeio_event_loop()関数の形式で実装されます。この関数のIPCはセマフォに基づいています。 必要に応じて、ユーザーは既存のPHPツールを使用して独自のイベントループを実行できます(たとえば、グローバル変数[CLIでのみ改善]またはSemaphore拡張を使用した同じセマフォを使用)。
ドキュメント: http : //www.php.net/eio
設置
libeio :
$ touch ~/.cvspass
$ cvs -z3 -d :pserver:anonymous@cvs.schmorp.de/schmorpforge co libeio
$ cd libeio
$ ./autogen.sh
$ ./configure
$ make
$ su -
# make install
えいお
$ wget 'http://pecl.php.net/get/eio' -O eio.tgz
$ tar xzvf eio.tgz && cd eio-*
$ phpize
$ ./configure --with-eio # further optional parameters(--enable-eio-debug recommended for first use) ...
$ make && make test
$ su -
# make install
その後、php.ini configに書き込みます
extension=eio.so
WebサーバーがCLIでない場合は再起動します。
Gentooに次のような問題がある場合
libtool: Version mismatch error. This is libtool 2.4, but the
libtool: definition of this LT_INIT comes from an older release.
libtool: You should recreate aclocal.m4 with macros from libtool 2.4
libtool: and run autoconf again.
make: *** [libevent.lo] Error 63
次のコマンドが役立ちます。
$ phpize
$ aclocal && libtoolize --force && autoreconf
$ ./configure --with-eio # further optional parameters(--enable-eio-debug recommended for first use) ...
$ make
#
次のディストリビューション用にコンパイルしたlibeioパッケージも使用できます 。
Debian_6.0 i586、x86_64
RedHat_RHEL-6 i586、x86_64
openSUSE_11.4 i586、x86_64
xUbuntu_10.04 i586、x86_64
xUbuntu_11.10 i586、x86_64
残念ながら、libeioの作成者はCVSのみを提供しています。
ただし、eioは簡単にインストールできます。
# pecl install eio # stable
# pecl install eio-beta # beta
# pecl install eio-alpha # alpha
または、SVNから最新版を取得できます。
$ svn co https://svn.php.net/repository/pecl/eio/trunk eio && cd eio
# pecl install --force package.xml
最後のコマンドはルート権限で与えられなければなりません
ついに
ご清聴ありがとうございました。 APIを追加/変更するための提案を歓迎します。
PS
このeioは簡単ではありませんでした。
更新
libeventの作成者と協力した結果:
追加: event_priority_set
追加: event_setの数値記述子のサポート
追加: event_buffer_newの数値記述子のサポート
実際、eioはファイル記述子のサポートを追加します。これは、これまでのところ、SVNのみでlibeventに効率的にバインドするために使用できます(以下を参照)。
多数の優先順位(実際の例だけでなく、実際の例を書く必要がある人):
<?php
function my_eio_poll($fd, $events, $arg) {
/* Some libevent regulation might go here .. */
if (eio_nreqs()) {
eio_poll();
}
/* .. and here */
}
function my_nop_cb($d, $r) {
var_dump($r); var_dump($d);
}
$base = event_base_new();
$event = event_new();
$fd = eio_get_event_stream();
var_dump($fd);
eio_nop(EIO_PRI_DEFAULT, "my_nop_cb", "nop data");
/* some other eio_* calls here ... */
// set event flags
event_set($event, $fd, EV_READ /*| EV_PERSIST*/, "my_eio_poll", array($event, $base));
// Set event priorities
event_base_priority_init($base, 10);
// set event base
event_base_set($event, $base);
// This one is my patch to libevent. Tony should apply it soon
echo "setting priority...\n";
var_dump(event_priority_set($event, 2));
// enable event
event_add($event);
// start event loop
event_base_loop($base);
/* The same kind of stuff is available via buffered libevent API*/
?>
SVN :
svn.php.net/repository/pecl/libevent/trunk
svn.php.net/repository/pecl/eio/trunk