在线聊天系统需要实现的基本功能包括:消息发送、消息接收、用户识别和消息存储。使用PHP作为后端语言、JS作为前端交互语言、MySQL作为数据存储、AJAX实现前后端异步通信,可以构建一个轻量经济的解决方案。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE messages (
id INT AUTO_INCREMENT PRIMARY KEY,
sender_id INT NOT NULL,
message TEXT NOT NULL,
sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (sender_id) REFERENCES users(id)
);
// login.php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'];
$password = $_POST['password'];
// 连接数据库验证用户
$conn = new mysqli('localhost', 'username', 'password', 'chat_db');
$stmt = $conn->prepare("SELECT id, password FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows === 1) {
$user = $result->fetch_assoc();
if (password_verify($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $username;
echo json_encode(['success' => true]);
exit;
}
}
echo json_encode(['success' => false, 'message' => 'Invalid credentials']);
}
// 前端JS
function sendMessage() {
const message = document.getElementById('message-input').value;
if (message.trim() === '') return;
fetch('send_message.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({message: message})
})
.then(response => response.json())
.then(data => {
if (data.success) {
document.getElementById('message-input').value = '';
fetchMessages(); // 刷新消息列表
}
});
}
// send_message.php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_SESSION['user_id'])) {
$data = json_decode(file_get_contents('php://input'), true);
$message = htmlspecialchars($data['message']);
$sender_id = $_SESSION['user_id'];
$conn = new mysqli('localhost', 'username', 'password', 'chat_db');
$stmt = $conn->prepare("INSERT INTO messages (sender_id, message) VALUES (?, ?)");
$stmt->bind_param("is", $sender_id, $message);
$stmt->execute();
echo json_encode(['success' => true]);
}
// 前端JS - 定时刷新
function fetchMessages() {
fetch('get_messages.php')
.then(response => response.json())
.then(messages => {
const chatContainer = document.getElementById('chat-container');
chatContainer.innerHTML = '';
messages.forEach(msg => {
const messageElement = document.createElement('div');
messageElement.className = 'message';
messageElement.innerHTML = `<strong>${msg.username}:</strong> ${msg.message}`;
chatContainer.appendChild(messageElement);
});
chatContainer.scrollTop = chatContainer.scrollHeight;
});
}
// 每2秒刷新一次
setInterval(fetchMessages, 2000);
// get_messages.php
session_start();
$conn = new mysqli('localhost', 'username', 'password', 'chat_db');
$result = $conn->query("
SELECT m.id, u.username, m.message, m.sent_at
FROM messages m
JOIN users u ON m.sender_id = u.id
ORDER BY m.sent_at DESC
LIMIT 50
");
$messages = [];
while ($row = $result->fetch_assoc()) {
$messages[] = $row;
}
echo json_encode($messages);
<!DOCTYPE html>
<html>
<head>
<title>轻量级聊天室</title>
<style>
#chat-container {
height: 400px;
overflow-y: scroll;
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.message {
margin-bottom: 5px;
padding: 5px;
border-bottom: 1px solid #eee;
}
</style>
</head>
<body>
<h1>聊天室</h1>
<div id="chat-container"></div>
<div>
<input type="text" id="message-input" placeholder="输入消息...">
<button onclick="sendMessage()">发送</button>
</div>
<script src="chat.js"></script>
</body>
</html>
问题1:消息延迟高
问题2:数据库负载高
问题3:用户同时在线数多时性能下降
这个实现提供了最基本的聊天功能,可以根据具体需求进行扩展和优化。整个系统可以在低配置服务器上运行,适合小型团队或个人使用。
没有搜到相关的沙龙