【问题标题】:Why would PHP include_once succeed but require_once, on the same file, fail?为什么 PHP include_once 会成功但 require_once 在同一个文件上会失败?
【发布时间】:2020-11-07 06:39:35
【问题描述】:

我有一个 PHP 脚本,它使用 require_once 来加载模块。它由 CRON 每小时运行一次并且工作正常自从添加了另一个模块后,它仍然可以在一夜之间正常工作(可能在负载较低时),但在白天经常失败(崩溃)。我在模块中的函数中添加了一些监控代码,以查看它是否失败,并且它肯定是它尝试加载模块的地方。为了确定脚本无法加载模块的原因,我将 require_once 更改为 include_once。出于某种原因,这似乎解决了问题 - 模块中的功能正在执行。谁能解释为什么 require_once 无法加载模块但 include_once 成功?以前有人遇到过这个问题吗?

【问题讨论】:

  • 您是否在require_once 周围添加了try {} catch($e) {} 以了解问题所在?
  • 没有看到所有涉及的代码,没有人可以肯定地说。这显然是某个地方的代码错误的结果,因为这两者根本不会自己随意行事。
  • 我不会将此与负载联系起来,而是与此脚本的作用联系起来。这是有条件的要求吗?也许当脚本通过 cron 运行时,它会处理一些记录并要求文件执行某些操作。一旦它被处理,另一个执行不需要文件,直到满足某些条件(添加新订单或其他),这在白天发生得更频繁。主要区别在于 include 只会警告包含失败,而 require 将停止执行并出现致命错误 - 所以我会说你的代码仍然无法正常工作,只是对问题不太严格。
  • require/include 在这段代码中 - spl_autoload_register( function( $class ) { require_once CLASSES_DIR . $class . '.class.php'; } );正如我所说,它在一夜之间工作得很好,白天也在工作。由于添加了另一个类,它仍然可以在一夜之间正常工作,但在白天实例化新类时经常崩溃。自从将 require_once 更改为 include_once 后,它一直运行良好。那是唯一的变化。我知道包含类模块是因为正在执行类函数。

标签: php require-once include-once


【解决方案1】:

require 和 include 函数执行相同的任务,小的区别是:

  • 当指定的文件位置无效或出现任何错误时,require 将产生致命 (E_COMPILE_ERROR) 级错误
  • include 将生成警告 (E_WARNING) 并继续执行代码。

见: 点击requireinclude

所以你没有解决问题,你只是将错误级别从 ERROR 转换为 WARNING,这就是你的脚本工作的原因。

【讨论】:

  • 公平点,但它没有解释为什么当脚本在一夜之间运行时 require_once 版本可以工作。
  • @Mike 我们无法在没有看到脚本的情况下回答您,可能有数百个原因会导致此问题
  • 感谢所有建议。我认为 require_once 失败是因为它无法加载模块。将其更改为 include_once 似乎可以解决问题,但正如您所说(上面),它将致命错误更改为警告。但是,由于模块中的功能正在执行,问题不可能是加载模块失败。它也没有发出任何警告。 :(
猜你喜欢
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 2012-04-26
相关资源
最近更新 更多