Maison  >  Article  >  développement back-end  >  Comment utiliser PHP pour développer la fonction de chat en ligne

Comment utiliser PHP pour développer la fonction de chat en ligne

WBOY
WBOYoriginal
2023-08-17 18:00:151534parcourir

Comment utiliser PHP pour développer la fonction de chat en ligne

Comment utiliser PHP pour développer une fonction de chat en ligne

À l'ère d'Internet d'aujourd'hui, la messagerie instantanée est devenue un élément indispensable de la vie quotidienne des gens. Le développement de fonctions de chat en ligne est devenu une exigence importante pour de nombreux sites Web et applications. Cet article explique comment utiliser PHP pour développer une fonction de chat en ligne simple et fournit des exemples de code à titre de référence.

Utiliser PHP pour développer des fonctions de chat en ligne implique principalement deux aspects technologiques : la construction de pages front-end et la mise en œuvre d'une communication en temps réel. Ce qui suit est un exemple simple pour montrer comment développer une fonctionnalité de chat en ligne à l'aide de PHP.

  1. Construction d'une page frontale

Tout d'abord, nous devons créer une page frontale pour afficher les enregistrements de discussion et les zones de saisie.

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

Le code ci-dessus crée un conteneur pour afficher l'historique des discussions, une zone de saisie pour saisir des messages et un bouton d'envoi pour envoyer des messages. Les messages reçus peuvent être ajoutés à l'historique des discussions via la fonction updateChat de JavaScript.

  1. Mise en œuvre de la communication en temps réel

Afin de réaliser la fonction de communication en temps réel, nous utiliserons la technologie PHP et WebSocket.

Tout d'abord, créez un script PHP pour le serveur WebSocket côté serveur.

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

Le code ci-dessus implémente un simple serveur WebSocket qui peut accepter et envoyer des messages.

De plus, nous devons également ajouter un code JavaScript client WebSocket à la page frontale pour une communication en temps réel avec le serveur.

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

Dans le code ci-dessus, nous traitons le message reçu via l'écouteur d'événements de WebSocket et l'ajoutons à l'historique des discussions. La fonction sendMessage est utilisée pour envoyer des messages au serveur.

À ce stade, nous avons implémenté une simple fonction de chat en ligne basée sur PHP. Grâce à l'exemple de code ci-dessus, je pense que les lecteurs peuvent avoir une compréhension préliminaire de la façon d'utiliser PHP pour développer des fonctions de chat en ligne, et peuvent étendre et optimiser les fonctions en fonction de leurs propres besoins.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn