PHP は動的スクリプト言語として、Web 開発の分野で広く使用されています。 PHP では通常、ブロッキング IO モデルを使用してクライアント リクエストを処理します。つまり、各リクエストを処理するスレッドが必要となり、大量のサーバー リソースが消費されます。この問題を解決するには、ノンブロッキング IO モデルを使用できます。EventLoop プログラミング モデルは、ノンブロッキング IO を実装する方法です。
I. EventLoop の概要
EventLoop は、ファイル記述子やシグナルなどのイベントをポーリングすることによって I/O を処理するイベント ループ フレームワークであり、イベント トリガーに基づく非同期モデルです。 EventLoop では、すべてのイベントは非同期であり、イベントが発生すると、EventLoop は対応するコールバック関数を呼び出して処理します。
PHP では、EventLoop は主に libevent 拡張機能に依存しています。libevent は、さまざまなプラットフォーム上で基礎となるイベントを処理するための統合インターフェイスを提供するイベント通知ライブラリです。
II. EventLoop プログラミング モデル
EventLoop は通常 3 つの部分で構成されます:
EventLoop では、Register が必要です。処理する必要があるすべてのイベント。以下は簡単なサンプル コードです。
$eventBase = event_base_new(); //创建event base $fd = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建socket event_set($event, $fd, EV_READ | EV_PERSIST, 'accept_conn', $eventBase); //注册事件 event_base_set($event, $eventBase); //将事件与event base关联 event_add($event); //添加事件
この例では、最初にイベント ベースを作成し、次に、socket_create 関数を使用してソケット記述子を作成します。次に、event_set 関数を使用してソケット記述子を読み取り可能なイベントとして登録し、それを処理するコールバック関数 accept_conn を指定します。
イベントの処理は EventLoop の中核部分であり、非同期呼び出しを実装するための鍵です。
EventLoop では、event_base_loop 関数を使用してイベント ループを開始する必要があります。イベントが発生すると、EventLoop は対応するコールバック関数を呼び出してイベントを処理します。以下は簡単なサンプル コードです:
function accept_conn($fd, $events, $arg) { $conn = socket_accept($fd); //接收客户端连接 $buf = socket_read($conn, 1024); //读取客户端请求 socket_write($conn, 'Hello World!'); //向客户端发送响应 socket_close($conn) //关闭连接 } $eventBase = event_base_new(); //创建event base $fd = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建socket event_set($event, $fd, EV_READ | EV_PERSIST, 'accept_conn', $eventBase); //注册事件 event_base_set($event, $eventBase); //将事件与event base关联 event_add($event); //添加事件 event_base_loop($eventBase); //启动事件循环
この例では、まず accept_conn コールバック関数を定義して、クライアント接続をリッスンするために使用されるソケット記述子を処理します。リスニングしているソケット記述子が読み取り可能な場合、EventLoop は accept_conn コールバック関数を呼び出してイベントを処理します。
accept_conn コールバック関数では、最初にsocket_accept 関数を使用してクライアント接続を受け入れ、次にクライアント要求を読み取り、クライアントに応答を送信し、最後に接続を閉じます。
最後に、event_del 関数を使用してイベント ベースからイベントを削除し、event_free 関数を使用してイベントによって占有されているリソースを解放する必要があります。イベント。以下は簡単なサンプル コードです。
event_del($event); //从event base中移除事件 event_free($event); //释放事件所占用的资源 event_base_free($eventBase); //释放event base所占用的资源
この例では、event_del 関数を使用してイベント ベースからイベントを削除し、event_free 関数を使用してイベントによって占有されているリソースを解放し、最後に占有されているイベントベースのリソースを解放するevent_base_free関数。
III. 概要
EventLoop プログラミング モデルは、イベント駆動型に基づく非同期プログラミング モデルであり、効率的なノンブロッキング IO を実現し、サーバーのパフォーマンスとスループットを向上させることができます。 PHP では、libevent 拡張機能を使用して EventLoop プログラミング モデルを実装できます。
以上がPHP 入門: EventLoop プログラミング モデルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。