好的,我遇到的最奇怪的PHP错误。
我有一个Joomla模块,它有一个startup.php,其中包含几个文件:
...
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 Apache 2.2.20 PHP 5.3.6
答案 0 :(得分:0)
想出来。它是一个名为“VQmod”的插件,它基本上将源文件重写为临时目录,在代码上应用搜索/替换。 require_once()语句被其他代码重写。当我改变它以至于搜索/替换不再适用时,我的原始代码将被执行。
我通过添加
来发现它log_error("... ".__FILE__)
显示它是从vqmod的缓存中执行的。即每次编辑文件时,vqmod都会看到我的更改并将其重写到缓存中,然后执行缓存而不是原始缓存。