php实现实时聊天
使用WebSocket实现实时聊天
WebSocket是一种在单个TCP连接上进行全双工通信的协议,适合实现实时聊天功能。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();
}
}
$server = new \Ratchet\App('localhost', 8080);
$server->route('/chat', new Chat, ['*']);
$server->run();
前端连接代码:
const conn = new WebSocket('ws://localhost:8080/chat');
conn.onmessage = e => {
console.log('Received:', e.data);
};
conn.onopen = () => conn.send('Hello Server!');
使用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');
前端轮询代码:
function pollMessages() {
fetch('get_messages.php')
.then(res => res.text())
.then(messages => {
document.getElementById('chat').innerHTML = messages;
setTimeout(pollMessages, 1000);
});
}
pollMessages();
使用Server-Sent Events(SSE)
SSE允许服务器主动向客户端推送数据,比轮询更高效。
PHP服务器端代码:

header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
while(true) {
$message = checkForNewMessage(); // 自定义消息检查逻辑
if($message) {
echo "data: $message\n\n";
ob_flush();
flush();
}
sleep(1);
}
客户端代码:
const evtSource = new EventSource("sse.php");
evtSource.onmessage = e => {
document.getElementById('chat').innerHTML += e.data + '<br>';
};
使用第三方服务
Firebase、Pusher等第三方服务提供现成的实时通信解决方案:
Firebase示例:
// 初始化
const config = {
apiKey: "YOUR_API_KEY",
authDomain: "YOUR_APP.firebaseapp.com",
databaseURL: "https://YOUR_APP.firebaseio.com"
};
firebase.initializeApp(config);
// 发送消息
firebase.database().ref('messages').push({
text: messageText,
timestamp: Date.now()
});
// 接收消息
firebase.database().ref('messages').on('child_added', snapshot => {
const msg = snapshot.val();
displayMessage(msg.text);
});
性能优化建议
消息队列系统如Redis可提升高并发场景下的性能:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 发布消息
$redis->publish('chat_channel', json_encode([
'user' => $userId,
'text' => $message
]));
// 订阅需在单独进程中运行
$redis->subscribe(['chat_channel'], function($redis, $channel, $msg) {
broadcastToClients($msg);
});






