ホームページ  >  記事  >  バックエンド開発  >  php_PHP チュートリアル用の libev 拡張機能

php_PHP チュートリアル用の libev 拡張機能

WBOY
WBOYオリジナル
2016-07-14 10:07:541549ブラウズ

ev は、C で書かれた高性能のフル機能のイベント ループである libev ライブラリへのインターフェイスを提供する PECL 拡張機能です。

リブブについて
Libev はイベント ループです。特定のイベント (ファイル記述子が読み取れる、タイムアウトが発生するなど) に関心を登録すると、これらのイベント ソースを管理し、プログラムにイベントを提供します。
では、libev とは何ですか? 以下はインターネットからの抜粋です:
libev は、高性能イベント ループ/イベント モデル ネットワーキング ライブラリであり、多くの新機能が含まれています。
これは、lievent および Event Perl モジュールの後の新しいネットワーク ライブラリのセットです。追求する目標は、より高速な速度、より少ないバグ、より多くの機能、より小さなサイズです。 www.2cto.com
これは libevent に非常に似ており、作者の紹介によると、libevent の代替として使用でき、より高いパフォーマンスを提供できます。複雑な設定は必要ありません。
これは前述の libevent と密接に関連しているようですが、この拡張機能の作成者は明らかにより積極的で、1 週間以内に 3 つのバージョンを提出しています。
コード例
タイマーの使い方
//タイマーを作成し、2秒後にトリガーします
$w1 = new EvTimer(2, 0, function () {
echo "2 秒経過しました";
});
//タイマーを作成し、2 秒後にトリガーし、1 秒ごとに繰り返します
// 手動で停止するまで
$w2 = new EvTimer(2, 1, function ($w) {
echo "毎秒呼び出され、2 秒後に起動されますn";
echo "iteration = "、Ev::iteration()、PHP_EOL;
// 5 回の反復後にウォッチャーを停止します
Ev::iteration() == 5 および $w->stop();
// さらに呼び出しにより 10 回を超える反復が発生した場合はウォッチャーを停止します
Ev::iteration() >= 10 および $w->stop();
});
//停止タイマーを作成します。手動で開始した場合にのみ有効です
$w_stopped = EvTimer::createStopped(10, 5, function($w) {
echo "stoppedn として作成されたタイマーのコールバック";
// 2 回の反復後にウォッチャーを停止します
Ev::iteration() >= 2 および $w->stop();
});
// Ev::stop() が呼び出されるか、すべてのウォッチャーが停止するまでループします
Ev::run();
// 起動して動作するか確認してください
$w_stopped->start();
echo "単一の反復を実行";
Ev::run(Ev::RUN_ONCE);
echo "2 番目のウォッチャーを再起動し、同じイベントの処理を試みますが、ブロックしないでください";
$w2->また();
Ev::run(Ev::RUN_NOWAIT);
$w = 新しい EvTimer(10, 0, function() {});
echo "ブロッキングループンを実行しています";
Ev::run();
エコー「ENDn」;
?>
出力内容
2秒経過
毎秒呼び出され、2秒後に起動されます
反復 = 1
毎秒呼び出され、2秒後に起動されます
反復 = 2
毎秒呼び出され、2秒後に起動されます
反復 = 3
毎秒呼び出され、2秒後に起動されます
反復 = 4
毎秒呼び出され、2秒後に起動されます
反復 = 5
単一の反復を実行する
停止として作成されたタイマーのコールバック
2 番目のウォッチャーを再起動し、同じイベントの処理を試みますが、ブロックしないでください
ブロッキングループの実行
毎秒呼び出され、2秒後に起動されます
反復 = 8
毎秒呼び出され、2秒後に起動されます
反復 = 9
毎秒呼び出され、2秒後に起動されます
反復 = 10
終了
I/O イベント
例1
// STDIN が読み取れるまで待ちます
$w = new EvIo(STDIN, Ev::READ, function ($watcher, $revents) {
echo "STDIN は読み取り可能です";
});
Ev::run(Ev::RUN_ONCE);
?>
例 2
/* 非同期 I/O を使用してソケットにアクセスします */
// `sockets' 拡張機能は依然として警告をログに記録します
// EINPROGRESS、EAGAIN/EWOULDBLOCK など
エラー報告(E_ERROR);
$e_nonblocking = 配列 (/*EAGAIN または EWOULDBLOCK*/11, /*EINPROGRESS*/115);
//WWW サービスのポートを取得します
$service_port = getservbyname('www', 'tcp');
// ターゲットホストの IP アドレスを取得します
$address = gethostbyname('google.co.uk');
// TCP/IPソケットを作成します
$socket =ソケット_作成(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === FALSE) {
echo "socket_create() が失敗しました: 理由: "
.socket_strerror(socket_last_error()) 。 「ん」;
}
// O_NONBLOCK フラグを設定します
socket_set_nonblock($socket);
// タイムアウトで中止
$timeout_watcher = new EvTimer(10.0, 0., function () use ($socket) {
socket_close($socket);
Ev::stop(Ev::BREAK_ALL);
});
// ソケットが書き込み可能なときに HEAD リクエストを作成します
$write_watcher = 新しい EvIo($socket, Ev::WRITE, 関数 ($w)
use ($socket, $timeout_watcher, $e_nonblocking) {
// タイムアウトウォッチャーを停止します
$timeout_watcher->stop();
// ライトウォッチャーを停止します
$w->stop();
$in = "HEAD / HTTP/1.1rn";
$in .= "ホスト: google.co.ukrn";
$in .= "接続: 閉じるrnrn";
if (!socket_write($socket, $in, strlen($in))) {
trigger_error("ソケットへの $in の書き込みに失敗しました"、E_USER_ERROR);
}
$read_watcher = new EvIo($socket, Ev::READ, function ($w, $re)
use ($socket, $e_nonblocking) {
// ソケットは読み取り可能です。ノンブロッキングモードを使用したrecv() 20バイト
$ret =ソケット_recv($socket, $out, 20, MSG_DONTWAIT);
if ($ret) {
echo $out;
} elseif ($ret === 0) {
// 全部読みました
$w->stop();
socket_close($socket);
戻る;
}
// EINPROGRESS、EAGAIN、または EWOULDBLOCK をキャッチしました
if (in_array(socket_last_error(), $e_nonblocking)) {
戻る;
}
$w->stop();
socket_close($socket);
});
Ev::run();
});
$result =socket_connect($socket, $address, $service_port);
Ev::run();
?>
HTTP/1.1 301 が完全に移動されました
場所: http://www.google.co.uk/
コンテンツタイプ: text/html; charset=UTF-8
日付: 2012 年 12 月 23 日 (日) 16:08:27 GMT
有効期限: 2013 年 1 月 22 日火曜日 16:08:27 GMT
キャッシュ制御: public、max-age=2592000
サーバー: gws
コンテンツの長さ: 221
X-XSS-保護: 1;モード=ブロック
X フレーム オプション: SAMEORIGIN
接続: 閉じる

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/477830.html技術記事 ev は、C で書かれた libev ライブラリの高性能フル機能イベント ループへのインターフェイスを提供する PECL 拡張機能です。 LIBEV について Libev はイベント ループです。特定の機能に興味を登録します...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:半分の労力で2倍の成果を出すPHPプログラミングができるクラスライブラリ_PHPチュートリアル次の記事:半分の労力で2倍の成果を出すPHPプログラミングができるクラスライブラリ_PHPチュートリアル

関連記事

続きを見る