Heim  >  Artikel  >  Backend-Entwicklung  >  Wie man mit PHP eine Online-Chat-Funktion entwickelt

Wie man mit PHP eine Online-Chat-Funktion entwickelt

WBOY
WBOYOriginal
2023-08-17 18:00:151536Durchsuche

Wie man mit PHP eine Online-Chat-Funktion entwickelt

So entwickeln Sie mit PHP eine Online-Chat-Funktion

Im heutigen Internetzeitalter ist Instant Messaging zu einem unverzichtbaren Bestandteil des täglichen Lebens der Menschen geworden. Die Entwicklung von Online-Chat-Funktionen ist für viele Websites und Anwendungen zu einer wichtigen Anforderung geworden. In diesem Artikel wird erläutert, wie Sie mit PHP eine einfache Online-Chat-Funktion entwickeln und Codebeispiele als Referenz bereitstellen.

Die Verwendung von PHP zur Entwicklung von Online-Chat-Funktionen umfasst hauptsächlich zwei Aspekte der Technologie: den Aufbau von Front-End-Seiten und die Implementierung von Echtzeitkommunikation. Das Folgende ist ein einfaches Beispiel, das zeigt, wie man Online-Chat-Funktionen mit PHP entwickelt.

  1. Aufbau der Frontend-Seite

Zuerst müssen wir eine Frontend-Seite erstellen, um Chat-Datensätze und Eingabefelder anzuzeigen.

<!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>

Der obige Code erstellt einen Container zum Anzeigen des Chatverlaufs, ein Eingabefeld zum Eingeben von Nachrichten und eine Senden-Schaltfläche zum Senden von Nachrichten. Empfangene Nachrichten können über die updateChat-Funktion von JavaScript zum Chat-Verlauf hinzugefügt werden.

  1. Implementierung der Echtzeitkommunikation

Um die Echtzeitkommunikationsfunktion zu realisieren, verwenden wir PHP- und WebSocket-Technologie.

Erstellen Sie zunächst serverseitig ein PHP-Skript für den WebSocket-Server.

<?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));
}
?>

Der obige Code implementiert einen einfachen WebSocket-Server, der Nachrichten akzeptieren und senden kann.

Darüber hinaus müssen wir der Front-End-Seite einen WebSocket-Client-JavaScript-Code für die Echtzeitkommunikation mit dem Server hinzufügen.

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>';
}

Im obigen Code verarbeiten wir die empfangene Nachricht über den Ereignis-Listener von WebSocket und fügen sie dem Chat-Verlauf hinzu. Mit der Funktion sendMessage werden Nachrichten an den Server gesendet.

An dieser Stelle haben wir eine einfache Online-Chat-Funktion auf Basis von PHP implementiert. Ich glaube, dass Leser durch den obigen Beispielcode ein vorläufiges Verständnis dafür erlangen können, wie PHP zur Entwicklung von Online-Chat-Funktionen verwendet wird, und die Funktionen entsprechend ihren eigenen Anforderungen erweitern und optimieren können.

Das obige ist der detaillierte Inhalt vonWie man mit PHP eine Online-Chat-Funktion entwickelt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn