PHP聊天室file_put_contents写入失败 无法更新log.html日志文件
PHP聊天室消息无法写入日志文件修复方案
核心故障原因
- 最高概率诱因:文件权限配置错误。服务器站点目录下的
log.html未给PHP运行进程分配写入权限,file_put_contents静默执行失败,前端无报错感知。Linux环境可将文件权限设置为0666(所有者/组/其他用户均可读写,不要给目录设置0777避免安全风险),Windows环境给Web服务(Apache/Nginx/IIS)的运行账号分配该文件的写入、修改权限即可。 - 日志文件结构错误:当前
log.html内提前写入了完整的<html><body>网页骨架,后续追加的消息div会被写到</html>闭合标签外,属于无效HTML,就算写入成功也会出现展示异常。 - 前端代码冗余:jQuery脚本中给
#submitmsg按钮重复绑定了两次完全相同的点击事件,点击一次提交会触发两次重复POST请求,属于无效逻辑。 - 无错误反馈机制:现有
post.php没有任何写入结果判断和返回逻辑,写入全程静默失败,浏览器端无法感知错误。
修正后代码
post.php(增加错误校验和返回,方便排查问题)
<?php session_start(); header('Content-Type: application/json'); $response = ['success' => false, 'msg' => '']; if(!isset($_SESSION['name'])){ $response['msg'] = '未登录状态下无法发送消息'; echo json_encode($response); exit; } if(!isset($_POST['text']) || trim($_POST['text']) === ''){ $response['msg'] = '消息内容不能为空'; echo json_encode($response); exit; } $text = trim($_POST['text']); $text_message = "<div class='msgln'><span class='chat-time'>".date("g:i A")."</span> <b class='user-name'>".$_SESSION['name']."</b> ".htmlspecialchars($text)."<br></div>"; if(!is_writable("log.html")){ $response['msg'] = 'log.html无写入权限,请检查服务器文件权限配置'; echo json_encode($response); exit; } $writeRes = file_put_contents("log.html", $text_message.PHP_EOL, FILE_APPEND | LOCK_EX); if($writeRes === false){ $response['msg'] = '写入日志失败,请检查目录权限'; }else{ $response['success'] = true; } echo json_encode($response); ?>
前端jQuery脚本(删除重复绑定,增加错误提示)
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function () { // 仅保留一次提交事件绑定 $("#submitmsg").click(function () { var clientmsg = $("#usermsg").val().trim(); if(!clientmsg){ alert('请输入要发送的消息内容'); return false; } $.post("post.php", { text: clientmsg }, function(res){ if(!res.success){ alert('消息发送失败:' + res.msg); } }, 'json'); $("#usermsg").val(""); return false; }); function loadLog() { var oldscrollHeight = $("#chatbox")[0].scrollHeight - 20; $.ajax({ url: "log.html", cache: false, success: function (html) { $("#chatbox").html(html); var newscrollHeight = $("#chatbox")[0].scrollHeight - 20; if(newscrollHeight > oldscrollHeight){ $("#chatbox").animate({ scrollTop: newscrollHeight }, 'normal'); } } }); } setInterval(loadLog, 2500); $("#exit").click(function () { var exit = confirm("确定要退出当前聊天会话吗?"); if (exit) { window.location = "index.php?logout=true"; } }); }); </script>
落地操作步骤
- 先清空服务器上
log.html的所有现有内容(删掉原来的html/body标签和测试消息),保存为空白文件,再给该文件配置可写权限。 - 用上面的代码替换原有
post.php和前端的jQuery脚本内容。 - 测试发送消息,如果弹出错误提示,按照提示内容对应排查配置即可;如果无报错,等待2.5秒自动刷新日志后就能看到发送的消息展示在聊天框中。
小提示:文件存储聊天记录仅适合个位数好友的小群组使用,如果后续使用人数变多,建议换成数据库存储,避免高并发下文件锁冲突、消息丢失的问题。
内容的提问来源于stack exchange,提问作者Jacob Rodriguez
相关产品推荐
相关产品推荐

