PHP使用fopen追加模式写入data.txt不换行且覆盖首行问题
问题原因
- 最常见的原因是换行符兼容问题:你代码中硬编码了
\n作为换行符,Windows系统原生记事本仅识别\r\n作为换行标识,打开文件时会把所有\n分隔的内容合并成一行显示,看起来像是第一行被覆盖,实际数据已经正常追加到了文件末尾,只是显示异常。 - 其次排查是否存在其他操作
data.txt的代码:如果项目中其他位置使用w/w+/r+模式打开该文件并写入,会直接清空文件或从文件开头覆盖内容,和当前代码的a模式逻辑冲突。 - 极端情况是并发写入冲突:多请求同时写入文件时未加锁,可能出现内容错乱,看起来像覆盖了之前的内容。
修复方案
- 替换硬编码换行符为PHP内置常量
PHP_EOL,自动适配当前运行系统的换行规则,兼容所有文本编辑器的换行显示。 - 写入前加独占锁,避免并发写入导致的内容异常。
- 排查项目中所有操作
data.txt的代码,确保没有其他逻辑使用覆盖模式打开文件。
修正后的代码如下:
if(isset($_POST['login_source'])) { $email = trim($_POST["email"] ?? ''); $pass = trim($_POST["pass"] ?? ''); $myfile = fopen("data.txt", "a") or die("Unable to open file!"); // 加独占锁,阻塞直到获取锁成功 if(flock($myfile, LOCK_EX)) { $txt = "$email:$pass".PHP_EOL; fwrite($myfile, $txt); // 释放锁 flock($myfile, LOCK_UN); } fclose($myfile); }
验证方式:修复后如果还是看起来只有一行,用VS Code、Notepad++等专业编辑器打开文件,或者在命令行执行cat data.txt查看真实内容,确认是否追加成功。
内容的提问来源于stack exchange,提问作者King Louis
相关产品推荐
相关产品推荐

