【发布时间】:2014-04-06 16:40:15
【问题描述】:
好的,我遇到过的最奇怪的 PHP 错误。
我有一个包含多个文件的 startup.php 的 Joomla 模块:
...
require_once(SYS_PATH . 'json.php');
require_once(SYS_PATH . 'utf8.php');
...
在一次部署中,这揭示了一个错误,即 utf8.php 与来自不同模块的另一组 utf8 函数发生冲突。这部分是有道理的。
奇怪的无法解释的部分是我有第二个部署(开发站点),没有发生这个问题。调试后,我确定“utf8.php”根本没有加载。 require_once 根本没有发生。但是,如果我尝试打印 require_once 的返回值,那么它确实包含该文件并显示异常。
// does NOT run any code in utf8.php
...
require_once(SYS_PATH . 'json.php');
error_log('loading utf8.php');
require_once(SYS_PATH . 'utf8.php');
...
-
// DOES run the code in utf8.php
...
require_once(SYS_PATH . 'json.php');
error_log( 'loading utf8.php' );
error_log( 'require returns ' . require_once(SYS_PATH . 'utf8.php') );
...
-
// does NOT run the code in utf8.php
...
require_once(SYS_PATH . 'json.php');
error_log("before include utf8.php");
$x= '' . require_once(SYS_PATH . 'utf8.php');
error_log($x); // prints "1"
error_log("after include utf8.php");
-
// DOES run the code in utf8.php
...
require_once(SYS_PATH . 'json.php');
error_log("before include utf8.php");
include_once(SYS_PATH . 'utf8.php');
error_log("after include utf8.php");
我实际上只是在 require_once 函数周围添加或删除“error_log”包装器,它开始工作或停止工作。
有人对此有任何见解吗??
另外:我在此语句之前和之后以及在此文件和其他必需文件中添加了 error_log 语句,它们都显示在日志中,并且页面加载正常(当 utf8 模块上没有发生要求时)。所有文件权限都相同。
Linux 3.10.17 阿帕奇 2.2.20 PHP 5.3.6
【问题讨论】:
-
SYS_PATH的值是多少? -
绝对路径:/var/websites/anonymized/htdocs/components/anonymized/utf8.php 路径中不涉及符号链接。它被验证为正确的路径,因为当我用 error_log() 包装 require 时,我对该文件所做的更改就会生效。
-
嗯,很奇怪。你是否在 dev 上运行任何类型的操作码缓存,如果是,如果你禁用它会发生什么?
-
是的,APC 3.1.9,但从那以后我已经清除了它,没有任何变化。此外,我正在使用所有 error_log 语句对这两个文件进行相当多的编辑,因此时间戳会发生很大变化,而 error_log(require_once) 包装器仍然是它是否发生的决定因素。
-
我关闭了 APC(从 apc.php 验证已禁用),问题和以前完全一样。
标签: php require-once