POSIX非同期I / O用のPHP拡張

背景





私はコメントで多くの批判を得るためにベンチャーしています。 しかし、私が最近書き終えた拡張機能について人々がどう思うか知りたいと思っています。 おそらく誰かがテストし、拡張機能が「ベータ版」になります。



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








All Articles