php实现在线即时聊天
PHP 实现在线即时聊天
使用 WebSocket 和 PHP
WebSocket 是实现即时聊天的现代技术,PHP 可以通过 Ratchet 库来实现 WebSocket 服务器。
安装 Ratchet:
composer require cboden/ratchet
创建 WebSocket 服务器:
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class Chat implements MessageComponentInterface {
protected $clients;
public function __construct() {
$this->clients = new \SplObjectStorage;
}
public function onOpen(ConnectionInterface $conn) {
$this->clients->attach($conn);
}
public function onMessage(ConnectionInterface $from, $msg) {
foreach ($this->clients as $client) {
$client->send($msg);
}
}
public function onClose(ConnectionInterface $conn) {
$this->clients->detach($conn);
}
public function onError(ConnectionInterface $conn, \Exception $e) {
$conn->close();
}
}
$app = new Ratchet\App('localhost', 8080);
$app->route('/chat', new Chat, ['*']);
$app->run();
前端连接 WebSocket:
const conn = new WebSocket('ws://localhost:8080/chat');
conn.onmessage = e => console.log(e.data);
conn.send('Hello');
使用 AJAX 轮询
如果无法使用 WebSocket,可以通过 AJAX 轮询模拟即时聊天。
后端处理消息:
// save_message.php
file_put_contents('messages.txt', $_POST['message'] . "\n", FILE_APPEND);
// get_messages.php
echo file_get_contents('messages.txt');
前端轮询:
setInterval(() => {
fetch('get_messages.php')
.then(res => res.text())
.then(console.log);
}, 1000);
document.querySelector('button').addEventListener('click', () => {
fetch('save_message.php', {method: 'POST', body: 'New message'});
});
使用数据库存储消息
MySQL 存储消息:
// 数据库配置
$db = new PDO('mysql:host=localhost;dbname=chat', 'user', 'pass');
// 保存消息
$stmt = $db->prepare('INSERT INTO messages (content) VALUES (?)');
$stmt->execute([$_POST['message']]);
// 获取消息
$stmt = $db->query('SELECT content FROM messages ORDER BY id DESC LIMIT 10');
echo json_encode($stmt->fetchAll());
安全性考虑
验证用户输入:
$message = htmlspecialchars($_POST['message'], ENT_QUOTES, 'UTF-8');
防止 SQL 注入:
$stmt = $db->prepare('INSERT INTO messages (content) VALUES (?)');
$stmt->execute([$message]);
性能优化
对于高并发场景,考虑使用 Redis 作为消息队列:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->rPush('chat_messages', $message);
$messages = $redis->lRange('chat_messages', 0, -1);






