0

我们的一台托管服务器遇到了一个非常奇怪的问题。

问题:似乎 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';

我目前最好的猜测是某种竞争条件正在被触发。

对正在发生的事情的准确描述:

  1. 调用 set_include_path()
  2. 调用 get_include_path()

预期结果: 2 应该匹配 1

实际的、间歇性的结果: 2 为空或包含以下之一(随机)

  1. PHP 源代码(文档块)
  2. 看似随机的字符串,无论长短
  3. 其他用户似乎已设置的其他 include_paths 的有效路径
  4. 一个空字符串
  5. 字符串“内容类型:文本/html”

我们尝试了以下方法:

  1. 使用最新的 PHP 版本重新编译 Apache 和 PHP
  2. 关闭 APC 重新编译 Apache 和 PHP
  3. 清除 APC 缓存
  4. 重启阿帕奇
  5. 重启整个服务器

一些技术细节:

  • 操作系统:CentOS 5.9
  • 网络服务器:Apache 2.2.23
  • PHP: 5.3.22

显示我的 include_path 变量的奇怪内容的屏幕截图:

PHP 注释现在突然出现在我的包含路径中 PHP 注释现在突然出现在我的包含路径中


HTTP 标头现在位于包含路径中 HTTP 标头现在位于包含路径中


包含路径中的乱码内容 包含路径中的乱码内容


包含路径中的更多乱码内容 包含路径中的更多乱码内容


我没有选择和想法。任何帮助将不胜感激。

4

1 回答 1

1

这个问题现在似乎已经解决了。由于此特定服务器是运行 WHM/Cpanel 的专用服务器,因此我已将此问题上报给 Cpanel 支持。

经过一些研究,问题被缩小到homeloader.so模块,这使得每个用户的 PEAR 库成为可能。禁用此模块后,症状消失。

此问题的根本原因仍在调查中,但如果其他人遇到类似问题,这可能是值得关注的。

于 2013-02-27T08:39:23.983 回答