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

时间:2011-06-22 03:29:10

标签: php require-once

我将此代码放在各种包含文件的顶部:

require_once("functions.php");

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

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

我的生产服务器上的php配置中是否存在导致require_once表现不同的内容?

7 个答案:

答案 0 :(得分:3)

您可以使用以下代码:

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

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

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

享受!!

答案 1 :(得分:2)

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

也许要调试它 函数文件中的echo __FILE__

答案 2 :(得分:2)

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

的绝对路径

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

答案 3 :(得分:1)

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

如果我没记错的话,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是否相同,但可能是因为docs引用了include_once以了解此构造的预期行为。

答案 4 :(得分:1)

在不区分大小写的文件系统中,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());

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

答案 5 :(得分:0)

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

我在我的网站上做的事情有这样的设置:

global.php&lt; - 诸如配置数据库之类的东西,包括具有随机函数的文件

header.php&lt; - 基本的html标题内容,global.php在这里是必需的。

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

答案 6 :(得分:0)

如果您要包含包含类的文件,您可以尝试使用__autoload,这样可以防止多个包含/要求运行,并阻止您列出一堆包含/要求。