php 实现聊天功能
使用 PHP 和 WebSocket 实现聊天功能
PHP 本身是服务器端脚本语言,实现实时聊天功能通常需要结合 WebSocket 或其他实时通信技术。以下是使用 PHP 和 Ratchet(一个 PHP WebSocket 库)实现聊天功能的方法。
安装 Ratchet 库:
composer require cboden/ratchet
创建 WebSocket 服务器:
<?php
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
require dirname(__DIR__) . '/vendor/autoload.php';
class Chat implements MessageComponentInterface {
protected $clients;
public function __construct() {
$this->clients = new \SplObjectStorage;
}
public function onOpen(ConnectionInterface $conn) {
$this->clients->attach($conn);
echo "New connection! ({$conn->resourceId})\n";
}
public function onMessage(ConnectionInterface $from, $msg) {
foreach ($this->clients as $client) {
if ($from !== $client) {
$client->send($msg);
}
}
}
public function onClose(ConnectionInterface $conn) {
$this->clients->detach($conn);
echo "Connection {$conn->resourceId} has disconnected\n";
}
public function onError(ConnectionInterface $conn, \Exception $e) {
echo "An error has occurred: {$e->getMessage()}\n";
$conn->close();
}
}
$server = IoServer::factory(
new HttpServer(
new WsServer(
new Chat()
)
),
8080
);
$server->run();
前端实现
创建一个简单的 HTML 页面连接到 WebSocket 服务器:

<!DOCTYPE html>
<html>
<head>
<title>PHP Chat</title>
</head>
<body>
<div id="chat"></div>
<input type="text" id="message" />
<button onclick="sendMessage()">Send</button>
<script>
const chat = document.getElementById('chat');
const message = document.getElementById('message');
const ws = new WebSocket('ws://localhost:8080');
ws.onmessage = function(e) {
chat.innerHTML += `<div>${e.data}</div>`;
};
function sendMessage() {
ws.send(message.value);
message.value = '';
}
</script>
</body>
</html>
使用 AJAX 轮询实现简单聊天
如果不使用 WebSocket,可以使用 AJAX 轮询实现简单的聊天功能:
服务器端 PHP (chat.php):

<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$_SESSION['messages'][] = [
'user' => $_POST['user'],
'message' => $_POST['message'],
'time' => time()
];
die();
}
$messages = $_SESSION['messages'] ?? [];
echo json_encode($messages);
客户端 HTML:
<!DOCTYPE html>
<html>
<head>
<title>Simple PHP Chat</title>
</head>
<body>
<div id="chat"></div>
<input type="text" id="user" placeholder="Your name">
<input type="text" id="message" placeholder="Your message">
<button onclick="sendMessage()">Send</button>
<script>
function updateChat() {
fetch('chat.php')
.then(response => response.json())
.then(messages => {
const chat = document.getElementById('chat');
chat.innerHTML = '';
messages.forEach(msg => {
chat.innerHTML += `<div><strong>${msg.user}:</strong> ${msg.message}</div>`;
});
});
}
function sendMessage() {
const user = document.getElementById('user').value;
const message = document.getElementById('message').value;
fetch('chat.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: `user=${encodeURIComponent(user)}&message=${encodeURIComponent(message)}`
}).then(() => {
document.getElementById('message').value = '';
updateChat();
});
}
setInterval(updateChat, 1000);
</script>
</body>
</html>
使用数据库存储聊天消息
对于更持久的聊天解决方案,可以使用数据库存储消息:
<?php
$db = new PDO('mysql:host=localhost;dbname=chat', 'username', 'password');
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$stmt = $db->prepare("INSERT INTO messages (user, message) VALUES (?, ?)");
$stmt->execute([$_POST['user'], $_POST['message']]);
die();
}
$stmt = $db->query("SELECT * FROM messages ORDER BY created_at DESC LIMIT 50");
echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC));
安全考虑
实现聊天功能时需要考虑以下安全措施:
- 对用户输入进行过滤和转义,防止 XSS 攻击
- 使用 HTTPS 保护数据传输
- 对 WebSocket 连接进行身份验证
- 限制消息频率防止滥用
- 敏感操作需要服务器端验证






