为啥 PHP include_once 会成功但 require_once 在同一个文件上会失败?

Posted

技术标签:

【中文标题】为啥 PHP include_once 会成功但 require_once 在同一个文件上会失败?【英文标题】: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 后,它一直运行良好。那是唯一的变化。我知道包含类模块是因为正在执行类函数。 【参考方案1】:

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

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

见: 点击require和include

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

【讨论】:

公平点,但它没有解释为什么当脚本在一夜之间运行时 require_once 版本可以工作。 @Mike 我们无法在没有看到脚本的情况下回答您,可能有数百个原因会导致此问题 感谢所有建议。我认为 require_once 失败是因为它无法加载模块。将其更改为 include_once 似乎可以解决问题,但正如您所说(上面),它将致命错误更改为警告。但是,由于模块中的功能正在执行,问题不可能是加载模块失败。它也没有发出任何警告。 :(

以上是关于为啥 PHP include_once 会成功但 require_once 在同一个文件上会失败?的主要内容,如果未能解决你的问题,请参考以下文章

php include_once 使我的代码停止运行

「PHP」include()include_once()require()require_once()的用法及区别

为啥 Laravel 会成为最成功的 PHP 框架

php会话随机丢失,无法理解为啥

PHP内的包含语句(include(),require(),include_once(),require_once())

include_once(../../config.php):打开流失败:没有这样的文件或目录