インターネットの継続的な発展に伴い、インスタント メッセージング (IM) システムは人々の生活や仕事に欠かせないツールになりました。中でも、メッセージの迅速な送信とリアルタイムのパフォーマンスをどのように確保するかが、システム設計の重要な部分となっています。この記事では、PHP の Socket と EPOLL を使用して、オンライン インスタント メッセージング システムでメッセージを送受信する方法を紹介します。
1. ソケットの概要
ソケット (またはソケット) は、コンピューター間の通信方法であり、元々は AT&T ベル研究所の新興企業である BSD (Berkeley Software Distribution) によって開発されました。ネットワークプログラミングで習得しなければならない技術の 1 つです。 Socket テクノロジーにより、アプリケーションはネットワーク通信に TCP/IP プロトコルを使用してデータの送受信を実現できます。
2. EPOLL の概要
EPOLL は、Linux カーネルによって提供される効率的な I/O 多重化メカニズムです。従来の選択およびポーリングのメカニズムでは、読み取りおよび書き込み操作ごとにファイル記述子テーブル全体を走査する必要があり、非効率的です。 EPOLL は、データが準備できた場合にのみ動作するコールバック関数を登録する方法を採用しており、これに比べて、システムの同時実行性とパフォーマンスを向上させることができます。
3. Socket と EPOLL を使用して PHP に IM システムを実装します
1. サーバー プログラム
サーバー プログラムでは、socket_create() 関数を使用して新しいソケット リソースを作成できます。 () 関数は、ホスト名または IP アドレスとポート番号をバインドして、ソケットをローカル アドレスに関連付けます。次に、socket_listen() 関数を呼び出して、クライアントが接続するのを待ちます。接続要求があると、socket_accept() 関数が呼び出されて接続を受け取ります。この時点で、新しい接続がタスク リストに追加されるはずです。
$socket =ソケット_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket,"0.0.0.0", 8888);
socket_listen($socket);
while(true){
$epoll_events = epoll_wait($epoll, $events, $timeout); foreach($events as $event){ if($event['resource'] == $socket){ $client = socket_accept($socket); $client_id = uniqid(); $client_list[$client_id] = array( 'socket' => $client, 'buffer' => '', ); $fd = socket_import_stream($client); stream_set_blocking($client, false); $event = stream_socket_create($fd, -1); stream_set_blocking($event, 0); epoll_ctl($epoll, EPOLL_CTL_ADD, $fd, EPOLLIN); }
2. メッセージの受信
プログラムの開始時に epoll オブジェクトを作成し、そのイベント リストにサーバー ソケットを追加します。新しい接続が受け入れられた後、stream_socket_create() を使用してファイル記述子に変換し、epoll オブジェクトのイベント リストに追加できます。また、各イベント リスニング ループで、socket_recv() 関数を使用してメッセージを受信し、タスク リストに保存します。
if($event['events'] & EPOLLIN){
if($event['resource'] == $socket){ $client = socket_accept($socket); $client_id = uniqid(); $client_list[$client_id] = array( 'socket' => $client, 'buffer' => '', ); $fd = socket_import_stream($client); stream_set_blocking($client, false); $event = stream_socket_create($fd, -1); stream_set_blocking($event, 0); epoll_ctl($epoll, EPOLL_CTL_ADD, $fd, EPOLLIN); } else { $fd = intval($event['fd']); $client_id = array_search($fd, array_column($client_list, 'socket')); $buffer = ''; while(socket_recv($event['resource'], $recv, 1024, MSG_DONTWAIT)){ $buffer .= $recv; } $client_list[$client_id]['buffer'] .= $buffer; }
}
3. メッセージの送信
メッセージを受信した後、socket_write( ) 応答データをクライアントに送信します。
function send_message($client_id, $message){
global $client_list; if(isset($client_list[$client_id])){ $message .= "
";
socket_write($client_list[$client_id]['socket'], $message, strlen($message)); }
}
4. 概要
PHP ソケットとEPOLL テクノロジーを使用すると、IM システム内で簡単にメッセージを送受信できるため、システムの同時実行性とパフォーマンスが大幅に向上しますが、同時に IM システムを設計する際には、セキュリティやデータ送信の信頼性などの側面も考慮する必要があります。 . . したがって、実際のアプリケーションでは、特定のニーズに応じて調整および最適化する必要があります。
以上がPHP はソケットと EPOLL を使用してオンライン インスタント メッセージング システムでメッセージを送受信しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。