EvEmbed::__construct

EvEmbed オブジェクトを作る

説明

public EvEmbed::__construct(
     object $other ,
     callable $callback = ?,
     mixed $data = ?,
     int $priority = ?
)

これは高度なウォッチャー型で、あるイベントループを別のイベントループに埋め込むことができます。 現在は、埋め込みループに対応しているのは IO イベントだけです。 他の型のウォッチャーを使うと、処理が遅延したり不正確な動きになったりする可能性があるので、 使ってはいけません。

詳細は、 »  libev のドキュメント を参照ください。

このウォッチャーは、BSD システムで kqueue が使えないときにも大量のソケットを処理できるようにするのに便利です。 以下の例を参照ください。

パラメータ

other

EvLoop のインスタンス。 埋め込むループです。これは埋め込み可能なものでなければいけません ( Ev::embeddableBackends を参照ください)。

callback

ウォッチャーのコールバック を参照ください。

data

このウォッチャーに関連づけるカスタムデータ。

priority

ウォッチャーの優先度

例1 kqueue バックエンドで作ったループをデフォルトのループに埋め込む例

<?php
/*
 * kqueue が使えるかどうかを調べ、ソケットで使う kqueue バックエンドを作ります
 * (通常は、どんな kqueue 実装でも動きます)。
 * kqueue/socket-only イベントループを loop_socket に格納します
 * (EVFLAG_NOENV も使えます)。
 *
 * この例を流用しました
 * http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#Examples_CONTENT-9
 */
$loop        = EvLoop::defaultLoop();
$socket_loop = NULL;
$embed       = NULL;

if (Ev::supportedBackends() & ~Ev::recommendedBackends() & Ev::BACKEND_KQUEUE) {
    if (($socket_loop = new EvLoop(Ev::BACKEND_KQUEUE))) {
        $embed = new EvEmbed($loop);
    }
}

if (!$socket_loop) {
    $socket_loop = $loop;
}

// これで、すべてのソケットに対して $socket_loop を使い、それ以外については $loop を使うようになりました
?>

参考

  • Ev::embeddableBackends