PHP を使用してオンライン チャット機能を開発する方法
今日のインターネット時代において、インスタント メッセージングは人々の日常生活に欠かせないものになっています。オンライン チャット機能の開発は、多くの Web サイトやアプリケーションにとって重要な要件になっています。この記事では、PHP を使用して簡単なオンライン チャット機能を開発する方法と、参考となるコード サンプルを紹介します。
PHP を使用してオンライン チャット機能を開発するには、主にフロントエンド ページの構築とリアルタイム通信の実装という 2 つのテクノロジーの側面が関係します。以下は、PHP を使用してオンライン チャット機能を開発する方法を示す簡単な例です。
まず、チャット レコードと入力ボックスを表示するフロントエンド ページを作成する必要があります。
<!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 関数を使用してチャット履歴に追加できます。
リアルタイム通信機能を実現するために、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 サイトの他の関連記事を参照してください。