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

WBOY
Libérer: 2023-08-17 18:02:02
original
1583 Les gens l'ont consulté

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>
Copier après la connexion

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));
}
?>
Copier après la connexion

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>';
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal