PHP写文件换行符应依目标系统选择:Linux/macOS用\n,Windows记事本兼容需\r\n,推荐用PHP_EOL适配当前环境,但跨平台分发时须显式指定\r\n;fwrite需手动添加换行符,file_put_contents更安全且支持数组自动换行。
\n 还是 \r\n
取决于目标系统和用途:Linux/macOS 用 \n,Windows 记事本兼容需 \r\n,但更稳妥的做法是用 PHP 内置常量 PHP_EOL——它会根据当前运行环境自动匹配换行符。
注意:PHP_EOL 不是字符串拼接的“万能解”,它只解决「当前 PHP 进程所在系统」的换行适配。如果你在 Linux 上生成给 Windows 用户下载的文本文件,仍建议显式用 \r\n,否则对方用记事本打开会显示为一行。
fopen + fwrite 写多行内容的正确姿势别直接连写多个 fwrite 并指望自动换行;每行末尾必须手动加换行符。
fwrite($fp, "第一行" . PHP_EOL);fwrite($fp, "第二行" . PHP_EOL);fwrite($fp, "第一行\r\n第二行\r\n");
fwrite($fp, "第一行"); fwrite($fp, "第二行");(没换行符,两行会粘在一起)file_put_contents 快速写带换行的文件这是最常用也最不容易出错的方式,支持数组自动按行写入,且默认行为就含换行。
file_put_contents("log.txt", "日志内容" . PHP_EOL, FILE_APPEND);
file_put_contents("list.txt", ["苹果", "香蕉", "橙子"]); → 每个数组元素占一行,内部用 \n 分隔file_put_contents("win.txt", str_replace("\n", "\r\n", implode("\n", $lines)));
^M
现象包括:用 cat 看正常,但用 vim 打开末尾显示 ^M;或在 Windows 上用记事本打开全是一行。
hexdump -C yourfile.txt | head 查看实际字节(0a 是 \n,0d 0a 是 \r\n)
\n;分发给 Windows 终端用户,优先用 \r\n
换行不是写完就完的事,得看谁读、在哪读、怎么读。一个 PHP_EOL 解不了所有场景,关键还是明确输出目标。