PHP代码在zsh中输出异常,未打印最后内容是zsh的Bug吗?
问题描述
我尝试在zsh和bash环境中运行以下PHP代码:
index.php
<?php echo "Str1"; echo "Str2\n"; echo "Str3"; ?>
在bash中运行的输出为:
[...]$ php index.php Str1Str2 Str3[...]$
但在zsh中运行时出现异常输出,未打印最后的Str3:
[...]$ php index.php Str1Str2 [...]$
请问这是zsh的Bug吗?
解答
这不是zsh的Bug,问题根源出在输出缓冲机制的差异上:
PHP的echo在输出到终端时,会根据输出目标自动调整缓冲策略:
- 当输出目标是交互式终端时,默认采用行缓冲模式——遇到换行符
\n就会立即刷新缓冲内容到终端; - 但如果输出内容末尾没有换行符,不同Shell对进程结束后剩余缓冲的处理逻辑不一样:bash会主动强制刷新剩余缓冲,把
Str3输出;而zsh没有这个额外处理步骤,导致留在缓冲里的Str3没被打印出来。
修复方法
可以通过以下几种方式解决:
- 给最后一个
echo添加换行符:echo "Str3\n"; - 手动强制PHP刷新输出缓冲:
echo "Str3"; flush(); - 运行PHP时直接禁用输出缓冲:
php -n -d output_buffering=0 index.php
内容的提问来源于stack exchange,提问作者mukkumayc
相关产品推荐
相关产品推荐

