PHP+SSE实现简单聊天功能

要实现一个简单的聊天功能,使用 PHP 和 Server-Sent Events (SSE),你可以按照以下步骤进行。SSE 允许服务器向客户端推送实时更新,非常适合用于简单的聊天应用。

1. 创建前端页面 (HTML + JavaScript)

首先,创建一个简单的 HTML 页面,用于显示聊天消息并发送新消息。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Simple Chat</title>
</head>
<body>
    <div id="chat" style="width: 300px; height: 400px; border: 1px solid #ccc; overflow-y: scroll;"></div>
    <input type="text" id="message" placeholder="Type your message here...">
    <button onclick="sendMessage()">Send</button>

    <script>
        // 创建一个 EventSource 对象来接收服务器推送的消息
        const eventSource = new EventSource('sse.php');

        // 监听服务器发送的消息
        eventSource.onmessage = function(event) {
            const chat = document.getElementById('chat');
            const message = document.createElement('div');
            message.textContent = event.data;
            chat.appendChild(message);
            chat.scrollTop = chat.scrollHeight; // 自动滚动到底部
        };

        // 发送消息到服务器
        function sendMessage() {
            const messageInput = document.getElementById('message');
            const message = messageInput.value.trim();

            if (message) {
                fetch('send_message.php', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded',
                    },
                    body: `message=${encodeURIComponent(message)}`
                });

                messageInput.value = ''; // 清空输入框
            }
        }
    </script>
</body>
</html>

2. 创建 SSE 服务器端脚本 (PHP)

创建一个 sse.php 文件,用于处理 SSE 连接并向客户端推送消息。

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
// 默认 可省略
header('Connection: keep-alive');  
// 注意 Nginx服务器需要加上 
header('X-Accel-Buffering: no'); // 禁用 Nginx 的响应缓冲

// 简单的消息存储(实际应用中可以使用数据库)
$messageFile = 'messages.txt';

// 检查文件是否存在,如果不存在则创建
if (!file_exists($messageFile)) {
    file_put_contents($messageFile, '');
}

// 获取最后修改时间
$lastModified = filemtime($messageFile);

while (true) {
    // 检查文件是否被修改
    clearstatcache();
    $currentModified = filemtime($messageFile);

    if ($currentModified > $lastModified) {
        $lastModified = $currentModified;
        // $messages = file_get_contents($messageFile);
        // $messages = explode("\n", $messages);

        // 忽略空行或忽略新行
        $messages = file($messageFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

        // 发送最新的消息
        $lastMessage = end($messages);
        if (!empty($lastMessage)) {
            echo "data: $lastMessage\n\n";
            ob_flush();
            flush();
        }
    }

    // 休眠 1 秒
    sleep(1);
}

3. 创建发送消息的脚本 (PHP)

创建一个 send_message.php 文件,用于接收客户端发送的消息并将其存储到文件中。

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $message = isset($_POST['message']) ? $_POST['message'] : '';

    if (!empty($message)) {
        $messageFile = 'messages.txt';
        file_put_contents($messageFile, $message . "\n" , FILE_APPEND);
    }
}

4. 运行和测试

  1. 将上述文件放在你的 PHP 服务器上。
  2. 打开浏览器访问 HTML 页面。
  3. 在输入框中输入消息并点击发送,消息会实时显示在聊天窗口中。

5. 注意事项

  • 这个示例是一个非常简单的实现,实际应用中可能需要考虑更多的安全性、性能和扩展性问题。
  • 消息存储使用了简单的文本文件,实际应用中建议使用数据库或其他更可靠的存储方式。
  • SSE 连接是单向的(服务器到客户端),如果需要双向通信,可以考虑使用 WebSocket。

通过以上步骤,你就可以使用 PHP 和 SSE 实现一个简单的聊天功能了。


运行截图_20250223120332.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容