PHP实现图文聊天
PHP实现图文聊天系统
数据库设计 创建数据库表存储聊天消息,包含字段:消息ID、发送者ID、接收者ID、消息内容、消息类型(文本/图片)、发送时间。图片消息可存储文件路径或Base64编码。
CREATE TABLE chat_messages (
id INT AUTO_INCREMENT PRIMARY KEY,
sender_id INT NOT NULL,
receiver_id INT NOT NULL,
content TEXT,
message_type ENUM('text', 'image') DEFAULT 'text',
file_path VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
文件上传处理 接收图片上传并保存到服务器指定目录,生成唯一文件名防止冲突。使用PHP的move_uploaded_file函数处理上传。
if(isset($_FILES['image'])){
$targetDir = "uploads/";
$fileName = uniqid().'_'.basename($_FILES['image']['name']);
$targetFile = $targetDir.$fileName;
if(move_uploaded_file($_FILES['image']['tmp_name'], $targetFile)){
// 保存文件路径到数据库
$stmt = $pdo->prepare("INSERT INTO chat_messages (sender_id, receiver_id, message_type, file_path) VALUES (?, ?, 'image', ?)");
$stmt->execute([$senderId, $receiverId, $targetFile]);
}
}
消息获取与显示 使用AJAX轮询或WebSocket实时获取新消息。区分文本和图片消息类型进行不同渲染。
// 获取聊天记录
$stmt = $pdo->prepare("SELECT * FROM chat_messages WHERE (sender_id=? AND receiver_id=?) OR (sender_id=? AND receiver_id=?) ORDER BY created_at ASC");
$stmt->execute([$userId, $contactId, $contactId, $userId]);
while($row = $stmt->fetch()){
if($row['message_type'] == 'text'){
echo '<div class="text-message">'.$row['content'].'</div>';
}else{
echo '<div class="image-message"><img src="'.$row['file_path'].'"></div>';
}
}
前端界面实现 创建聊天界面包含消息显示区域、文本输入框和图片上传按钮。使用CSS区分发送和接收的消息样式。
<div id="chat-container">
<div id="messages"></div>
<form id="chat-form">
<input type="text" id="message-input" placeholder="输入消息...">
<input type="file" id="image-upload" accept="image/*">
<button type="submit">发送</button>
</form>
</div>
实时更新技术 实现消息实时推送可选择:
- AJAX轮询:定时请求服务器检查新消息
- WebSocket:建立持久连接实现双向通信
- Server-Sent Events(SSE):服务器单向推送
// AJAX轮询示例
setInterval(function(){
$.get('get_messages.php', function(data){
$('#messages').html(data);
});
}, 3000);
安全考虑 对用户输入进行过滤防止XSS攻击,文件上传检查MIME类型和扩展名,设置文件大小限制。使用预处理语句防止SQL注入。
// 过滤文本消息
$cleanContent = htmlspecialchars($_POST['message'], ENT_QUOTES, 'UTF-8');
性能优化 对图片消息进行压缩处理,使用分页加载历史消息,建立消息索引提高查询效率,考虑使用Redis缓存频繁访问的数据。







