在运行 的服务器上FreeBSD 8.3-RELEASE-p3
,Apache 2.2.22
从端口,PHP version 5.4.6
从端口,输出在第二脚本加载。今天才检测到有问题的行为,但我们怀疑这是由最近的端口更新引起的。
以下是示例脚本:
<?php
// index.php
print 'top of index.php<br>';
require 'blah.php';
print '<br>after require';
?>
<?php
// blah.php
print 'blah';
?>
文件第一次修改后,这是输出:
top of index.php<br>
blah
<br>after require
对同一脚本的第二次调用(以及任何后续调用)会产生随机垃圾输出,例如这个ö
或àœ~cept-Encodin
或ðš~~
~`... 基本上是乱码垃圾。有时它是文件名的块。
在 Apache 错误日志中,我们看到了段错误和 PHP 错误,指出函数“\x0”未定义,指向上面的第 1 行index.php
。显然,print
这是一个已定义的函数!
如果保存了文件(导致 ctime 发生变化),下一次加载将再次显示预期的输出,但任何后续加载都会再次出现乱码。重新启动服务器即可实现这一点,但有时在发生混乱之前,您可以进行 3-4 次加载。
我怀疑 gzip 或 zlib 或其他压缩或操作码缓存等存在问题。但是,我们的 php.ini 与另一台具有相同设置和版本的服务器完全相同,并且运行正常。
如果有人能告诉我可能的原因,或者进一步诊断问题的有效方法,我将不胜感激。我检查了 php.ini 设置,设置了最小样本,并验证了 zlib 是否已关闭 - 没用。