php require_once 尝试仅在我的生产服务器上包含第二次

Posted

技术标签:

【中文标题】php require_once 尝试仅在我的生产服务器上包含第二次【英文标题】:php require_once tries to include a second time on my production server only 【发布时间】:2011-09-20 01:06:42 【问题描述】:

我在各种包含文件的顶部都有这段代码:

require_once("functions.php");

有时我需要包含几个包含文件来生成一个页面,并且在我的本地服务器上这工作正常,因为上面的代码告诉它只包含 functions.php 一次(因此它不会尝试两次声明函数) .

当我上传到我的生产服务器时,它突然第二次尝试包含 functions.php,导致第二次尝试重新声明函数时出现致命错误。

我的生产服务器上的 php 配置中有什么东西会导致 require_once 的行为不同吗?

【问题讨论】:

【参考方案1】:

您可以使用以下代码:

require_once(realpath(dirname(__FILE__) . '/functions.php'));

如果functions.php 位于根目录的另一个目录中,则修改functions.php 之前的路径位置。 函数 realpath(dirname(FILE) 获取根文件夹的路径。所以你应该在你的 index.php 中包含你的函数并修改你的 function.php 是否在任何目录中,例如:

require_once (realpath(dirname(__FILE__) . '/your_directory_name/functions.php'));

享受!!

【讨论】:

由于站点结构的变化,我有一个functions.php 的旧副本漂浮在另一个目录中。我想是因为我没有指定绝对路径,像这个 PHP 被捡了两次。无论如何我已经删除了重复项,但我不知道这些功能,所以谢谢! 上述函数获取根文件夹的路径。所以你应该在你的 index.php 中包含你的函数并修改你的 funciton.php 是否在任何目录中,例如: require_once (realpath(dirname(FILE) . '/your_directory_name/functions.php')) ;【参考方案2】:

您是否可能有名为functions.php 的重复文件? 您的示例代表一个相对位置,您是否可以加载两次?

也许调试它会是 echo __FILE__ 来自函数文件。

【讨论】:

谢谢 Richard - 由于站点结构发生了变化(而且我没有删除旧文件),结果我在另一个目录中有该文件的第二个副本。我不确定为什么这在我的本地服务器上不是问题,但我认为是因为我没有指定绝对路径。【参考方案3】:

检查您的路径设置,如果函数名称是通用的,则很可能正在加载另一个同名文件。除了回显提到的__FILE__ 值之外,只需尝试将其命名为您知道是唯一的名称和/或使用像

这样的绝对路径

require_once dirname(__FILE__).'/functions.php';

【讨论】:

由于站点结构的变化,我有一个functions.php 的旧副本漂浮在另一个目录中。我想是因为我没有指定绝对路径,像这个 PHP 被捡了两次。无论如何我已经删除了重复项,但我不知道这些功能,所以谢谢!【参考方案4】:

也许两台服务器上的错误处理级别设置不同?

如果我没记错的话,require_once 会在多次调用时简单地返回 true。

这个结构可能会产生一些奇怪的结果:

使用 include_once 加载(甚至是伪造的)文件两次,返回值为 true。

例子:

 <?php
  var_dump(include_once 'fakefile.ext'); // bool(false)
  var_dump(include_once 'fakefile.ext'); // bool(true)
 ?>

这是因为根据 php,该文件已经包含一次(即使它不存在)。

不确定这是否与 require_once 相同,但很可能是因为文档参考了 include_once 以了解此构造的预期行为。

【讨论】:

【参考方案5】:

在不区分大小写的文件系统中,require_once 语言结构将指向同一个文件,无论路径中的大小写如何。然而,这就是问题所在,尽管不同的大小写变体指向同一个文件,但在检查文件是否已被包含时,它们不会被视为同一个文件。

require_once __DIR__.'/address/src/Coordinates.php';
require_once __DIR__.'/Address/src/Coordinates.php';

在上面的示例中,在不区分大小写的文件系统中,两行都将尝试要求同一个文件。第二个文件会成功,因为路径的大小写不同。

如果您在所需文件中有更多的 require_once 语言结构,情况会变得更糟,即您正在执行多级 requires,并结合相对路径。在这种情况下,嵌套的相对路径将使用更高级别 requires 中使用的大小写解析为完整路径。如果在这个嵌套结构中的任何地方使用不同的大小写,您将遇到同样的问题。

var_dump(get_included_files());

这将为您提供包含文件的列表,其中包含完整路径和您使用的确切大小写。这将帮助您快速找到 colprit。

【讨论】:

【参考方案6】:

老实说,我想不出任何会导致这种行为的东西,如果我对您的网站的结构有所了解,我可以就如何以不同的方式构建它提供一些建议,这样就不会发生这种情况。

我在我的网站上做的事情就是进行这种设置:

global.php

header.php

然后在所有其他文件中,只需要头文件,你应该没有冲突。如果您使用的是特定框架(CakePHP、Kohana),那么这肯定会改变一些事情……就像我说的那样,没有足够的信息可以立即进行。

【讨论】:

感谢您的想法!原来我在另一个目录(旧)中有第二个同名文件,因为我没有指定文件的绝对路径,所以 PHP 在某些情况下会同时使用这两个文件。我通过删除旧文件来解决它,但我相信绝对路径上的其他答案会起作用......再次感谢!【参考方案7】:

如果您包含包含类的文件,您可能希望尝试使用__autoload,它应该可以防止多个包含/要求运行,并防止您列出一堆包含/要求。

【讨论】:

我没听说过这个mc——我会去看看!谢谢

以上是关于php require_once 尝试仅在我的生产服务器上包含第二次的主要内容,如果未能解决你的问题,请参考以下文章

Require_once 似乎不会影响所有功能?

仅在 git push 后重新验证 opcache

在 jquery post call 中不能 require_once

有人可以指出为啥我的 require_once() 函数找不到路径吗? php

如何使用 php 在我的登录时实现 cookie"

PHP - 类构造中的Require_once