php - 随机出现“无法重新定义...”错误
问题描述
PHP 5.6、Windows 服务器 2016、IIS 10
PHP 中的任何人都熟悉该错误:
PHP Fatal error: Cannot redeclare mainContent() (previously declared in [the controller file]:12) in [some included file] on line 29
事情是这样的:这个错误刚刚出现。一个已经运行了好几天并且没有被触及的程序刚刚开始抛出错误。当我重新启动 IIS 时,错误消失,一切恢复正常。
这类似于此错误:https ://bugs.php.net/bug.php?id=30075
所以这不是:
- 该函数没有在程序的任何地方声明两次。所讨论的函数名称“mainContent”在任何程序中都被保留和使用一次且仅使用一次。
- 每个包含/要求都是include_once或require_once,没有例外,所以它不是双重包含。
我确信这两个事实,因为我是唯一的开发人员,所以没有其他人可以进行更改,更不用说在我不知情的情况下破坏代码。
当我搜索解决方案时,无论我在 Google/Bing/Yahoo/stackoverflow/reddit 上,我发现的只是对双重包含或两次声明函数的通常解释。该错误仅显示在一个未受影响的程序上,该程序已经运行了几天而没有出现此错误,然后随着 IIS 重新启动而消失。它不在代码中!
我不可能是唯一遇到过这个问题的人,但我找不到解决方案。
(我打算将站点升级到 PHP7,但这不是 1 <=> 1 转换,并且客户的日常业务不允许停机,所以我在这里停留了一段时间。)
解决方案
这是重现您报告的问题的简单示例:
<?php
function foo(int $a) {
echo $a;
echo "\n";
}
function bar(int $b) {
echo $b;
echo "\n";
}
echo "I'm running. gonna redeclare\n";
function foo(int $x) {
print "i'm the redeclared foo\n";
}
foo(23);
echo "finito\n";
您可以将其保存到名为“test.php”的文件中并使用 php "c:\path\to\test.php" 执行它
错误消息告诉您一个同名的函数已被声明了两次。
请注意,如果这是一个 Web 应用程序,那么“运行数天”的概念并不完全正确,因为对 Web 应用程序中特定 PHP 脚本的每个请求都是在某种全新环境中对脚本的新执行. 某些状态可能是共享的,例如会话,以及带外数据,例如文件和数据库对象,但仅此而已。
除非它是某种长时间运行的脚本,否则天数是不相关的。
这个代码路径完全有可能只在某些特定条件下被遍历。
没有任何额外的上下文,这是我能提供的最好的。