ホームページ  >  記事  >  バックエンド開発  >  PHP はソケットと EPOLL を使用してオンライン インスタント メッセージング システムでメッセージを送受信します

PHP はソケットと EPOLL を使用してオンライン インスタント メッセージング システムでメッセージを送受信します

WBOY
WBOYオリジナル
2023-05-24 10:31:351296ブラウズ

インターネットの継続的な発展に伴い、インスタント メッセージング (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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。