ホームページ >バックエンド開発 >PHPチュートリアル >PHPを使ってオンラインチャット機能を開発する方法

PHPを使ってオンラインチャット機能を開発する方法

WBOY
WBOYオリジナル
2023-08-17 18:00:151633ブラウズ

PHPを使ってオンラインチャット機能を開発する方法

PHP を使用してオンライン チャット機能を開発する方法

今日のインターネット時代において、インスタント メッセージングは​​人々の日常生活に欠かせないものになっています。オンライン チャット機能の開発は、多くの Web サイトやアプリケーションにとって重要な要件になっています。この記事では、PHP を使用して簡単なオンライン チャット機能を開発する方法と、参考となるコード サンプルを紹介します。

PHP を使用してオンライン チャット機能を開発するには、主にフロントエンド ページの構築とリアルタイム通信の実装という 2 つのテクノロジーの側面が関係します。以下は、PHP を使用してオンライン チャット機能を開発する方法を示す簡単な例です。

  1. フロントエンド ページの構築

まず、チャット レコードと入力ボックスを表示するフロントエンド ページを作成する必要があります。

<!DOCTYPE html>
<html>
<head>
    <title>在线聊天</title>
    <style>
        .container {
            border: 1px solid #ccc;
            height: 400px;
            width: 500px;
            padding: 10px;
            overflow-y: scroll;
        }
    </style>
</head>
<body>
    <div class="container" id="chatContainer"></div>
    <input type="text" id="messageInput">
    <input type="button" value="发送" onclick="sendMessage()">
</body>
<script>
    function updateChat(data) {
        document.getElementById('chatContainer').innerHTML += '<p>' + data + '</p>';
    }

    function sendMessage() {
        var message = document.getElementById('messageInput').value;
        // 向服务器发送消息的代码
    }
</script>
</html>

上記のコードは、チャット記録を表示するためのコンテナ、メッセージを入力するための入力ボックス、およびメッセージを送信するための送信ボタンを作成します。受信したメッセージは、JavaScript の updateChat 関数を使用してチャット履歴に追加できます。

  1. リアルタイム通信の実装

リアルタイム通信機能を実現するために、PHPとWebSocketの技術を利用します。

まず、サーバー側でWebSocketサーバー用のPHPスクリプトを作成します。

<?php
$host = 'localhost';
$port = '8080';

$null = NULL;

$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($server, 0, $port);
socket_listen($server);

$clients = array($server);

while (true) {
    $changed = $clients;
    socket_select($changed, $null, $null, 0, 10);

    if (in_array($server, $changed)) {
        $socket_new = socket_accept($server);
        $clients[] = $socket_new;

        $header = socket_read($socket_new, 1024);
        performHandshaking($header, $socket_new, $host, $port);

        socket_getpeername($socket_new, $ip);
        $response = mask(json_encode(array('type' => 'system', 'message' => $ip . ' connected.')));
        sendMessage($response);

        $found_socket = array_search($server, $changed);
        unset($changed[$found_socket]);
    }

    foreach ($changed as $changed_socket) {
        while (socket_recv($changed_socket, $buf, 1024, 0) >= 1) {
            $received_text = unmask($buf);
            $tst_msg = json_decode($received_text);
            $user_name = $tst_msg->name;
            $user_message = $tst_msg->message;
            $response_text = mask(json_encode(array('type' => 'usermsg', 'name' => $user_name, 'message' => $user_message)));
            sendMessage($response_text);
            break 2;
        }

        $buf = @socket_read($changed_socket, 1024, PHP_NORMAL_READ);
        if ($buf === false) {
            $found_socket = array_search($changed_socket, $clients);
            socket_getpeername($changed_socket, $ip);
            unset($clients[$found_socket]);
            $response = mask(json_encode(array('type' => 'system', 'message' => $ip . ' disconnected.')));
            sendMessage($response);
        }
    }
}

socket_close($server);

function sendMessage($message) {
    global $clients;
    foreach ($clients as $changed_socket) {
        @socket_write($changed_socket, $message, strlen($message));
    }
    return true;
}

function unmask($text) {
    $length = ord($text[1]) & 127;

    if ($length == 126) {
        $masks = substr($text, 4, 4);
        $data = substr($text, 8);
    } elseif ($length == 127) {
        $masks = substr($text, 10, 4);
        $data = substr($text, 14);
    } else {
        $masks = substr($text, 2, 4);
        $data = substr($text, 6);
    }

    $text = "";

    for ($i = 0; $i < strlen($data); ++$i) {
        $text .= $data[$i] ^ $masks[$i % 4];
    }

    return $text;
}

function mask($text) {
    $b1 = 0x80 | (0x1 & 0x0f);
    $length = strlen($text);

    if ($length <= 125) {
        $header = pack('CC', $b1, $length);
    } elseif ($length > 125 && $length < 65536) {
        $header = pack('CCn', $b1, 126, $length);
    } elseif ($length >= 65536) {
        $header = pack('CCNN', $b1, 127, $length);
    }

    return $header . $text;
}

function performHandshaking($receved_header, $client_conn, $host, $port) {
    $headers = array();
    $lines = preg_split("/
/", $receved_header);

    foreach ($lines as $line) {
        $line = rtrim($line);
        if (preg_match('/A(S+): (.*)z/', $line, $matches)) {
            $headers[$matches[1]] = $matches[2];
        }
    }

    $sec_key = $headers['Sec-WebSocket-Key'];
    $sec_accept = base64_encode(sha1($sec_key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));

    $upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake
" .
        "Upgrade: websocket
" .
        "Connection: Upgrade
" .
        "WebSocket-Origin: $host
" .
        "WebSocket-Location: ws://$host:$port/demo/shout.php
" .
        "Sec-WebSocket-Accept:$sec_accept

";

    socket_write($client_conn, $upgrade, strlen($upgrade));
}
?>

上記のコードは、メッセージを送受信できる単純な WebSocket サーバーを実装しています。

さらに、サーバーとのリアルタイム通信のために、WebSocket クライアントの JavaScript コードをフロントエンド ページに追加する必要もあります。

var socket = new WebSocket('ws://localhost:8080');

socket.onopen = function() {
    updateChat("连接已建立");
};

socket.onmessage = function(e) {
    updateChat(e.data);
};

socket.onclose = function() {
    updateChat("连接已关闭");
};

function sendMessage() {
    var message = document.getElementById('messageInput').value;
    socket.send(message);
    document.getElementById('messageInput').value = '';
}

function updateChat(data) {
    document.getElementById('chatContainer').innerHTML += '<p>' + data + '</p>';
}

上記のコードでは、WebSocket イベント リスナーを通じて受信したメッセージを処理し、チャット レコードに追加します。 sendMessage 関数は、サーバーにメッセージを送信するために使用されます。

これまでに、PHP をベースにした簡単なオンライン チャット機能を実装しました。上記のサンプルコードを通じて、読者は PHP を使用してオンライン チャット機能を開発する方法を予備的に理解し、必要に応じて機能を拡張および最適化できると思います。

以上がPHPを使ってオンラインチャット機能を開発する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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