首页 > 解决方案 > 随机出现“无法重新定义...”错误

问题描述

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

所以这不是:

我确信这两个事实,因为我是唯一的开发人员,所以没有其他人可以进行更改,更不用说在我不知情的情况下破坏代码。

当我搜索解决方案时,无论我在 Google/Bing/Yahoo/stackoverflow/reddit 上,我发现的只是对双重包含两次声明函数的通常解释。该错误仅显示在一个未受影响的程序上,该程序已经运行了几天而没有出现此错误,然后随着 IIS 重新启动而消失。它不在代码中!

我不可能是唯一遇到过这个问题的人,但我找不到解决方案。

(我打算将站点升级到 PHP7,但这不是 1 <=> 1 转换,并且客户的日常业务不允许停机,所以我在这里停留了一段时间。)

标签: phpwindowsiis

解决方案


这是重现您报告的问题的简单示例:

<?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 脚本的每个请求都是在某种全新环境中对脚本的新执行. 某些状态可能是共享的,例如会话,以​​及带外数据,例如文件和数据库对象,但仅此而已。

除非它是某种长时间运行的脚本,否则天数是不相关的。

这个代码路径完全有可能只在某些特定条件下被遍历。

没有任何额外的上下文,这是我能提供的最好的。


推荐阅读