我们的一台托管服务器遇到了一个非常奇怪的问题。
问题:似乎 PHP 的 include_path 被我目前无法确定的进程半随机地改变了。这很奇怪,因为我们禁用了操作码缓存,多次重新启动服务器并使用 mod_ruid2 将用户帐户彼此隔离。
重现此问题的脚本(除此之外没有其他内容):
// Removing this call from the file makes the errors go away
// This is just a part of our default include path, but is explicitly
// defined here to be able to reproduce the problem
set_include_path('.:/usr/local/share/php');
// Obviously, include_path should now be exactly the value as set above
echo 'Include path is: ';
var_dump(get_include_path());
echo '<br />';
// Debugging line: what is the cwd?
echo 'CWD IS: ';
var_dump(getcwd()) . '<br />';
// Test local file inclusion; this works
require_once 'bar.php';
// Test global file inclusion from include_path (location: /usr/local/share/php/)
// this intermittently fails
require_once 'Zend/Loader/Autoloader.php';
我目前最好的猜测是某种竞争条件正在被触发。
对正在发生的事情的准确描述:
- 调用 set_include_path()
- 调用 get_include_path()
预期结果: 2 应该匹配 1
实际的、间歇性的结果: 2 为空或包含以下之一(随机)
- PHP 源代码(文档块)
- 看似随机的字符串,无论长短
- 其他用户似乎已设置的其他 include_paths 的有效路径
- 一个空字符串
- 字符串“内容类型:文本/html”
我们尝试了以下方法:
- 使用最新的 PHP 版本重新编译 Apache 和 PHP
- 关闭 APC 重新编译 Apache 和 PHP
- 清除 APC 缓存
- 重启阿帕奇
- 重启整个服务器
一些技术细节:
- 操作系统:CentOS 5.9
- 网络服务器:Apache 2.2.23
- PHP: 5.3.22
显示我的 include_path 变量的奇怪内容的屏幕截图:
PHP 注释现在突然出现在我的包含路径中
HTTP 标头现在位于包含路径中
包含路径中的乱码内容
包含路径中的更多乱码内容
我没有选择和想法。任何帮助将不胜感激。