【问题标题】:PHP require_once ignored unless I error_log the return code?PHP require_once 被忽略,除非我 error_log 返回代码?
【发布时间】: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


【解决方案1】:

想通了。这是一个名为“VQmod”的插件,它本质上将源文件重写到临时目录中,对代码应用搜索/替换。 require_once() 语句被其他代码重写。当我将其更改到足以使搜索/替换不再适用时,我的原始代码将被执行。

我通过添加一个发现它

log_error("... ".__FILE__)

这表明它是从 vqmod 的缓存中执行的。即每次我编辑文件时,vqmod 都会看到我的更改并将其重写到缓存中,然后执行缓存而不是原来的。

【讨论】:

    猜你喜欢
    • 2011-12-28
    • 2010-11-19
    • 2021-01-13
    • 2021-10-03
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    相关资源
    最近更新 更多