【问题标题】:PHP include_once not working for file in parent directoryPHP include_once 不适用于父目录中的文件
【发布时间】:2011-01-10 23:14:06
【问题描述】:

我刚刚开始在一个已传给我的网站上工作,但该网站无法正常工作。我发现在 /admin/index.php 中尝试实例化 /classes/admin.php 的实例时出现问题。但是,如果我将 /admin/index.php 复制到 /admin-index.php,它可以很好地实例化该类。另外,如果我将 /classes/admin.php 移动到 /admin/classes/admin.php 中,我也可以很好地实例化它。至少有一个其他类我注意到了这一点。

我还注意到这在我的本地开发机器上不是问题。这只是服务器上的问题。

您可以在http://charlesekublyfoundation.org/admin/phpinfo.php 找到有关服务器的信息。我的开发机器是运行 Apache 2.2 和 PHP 5.2.11 (Apache/2.2.14 (Win32) PHP/5.2.11 ) 的 WinXP 机器。

有人见过这样的吗?似乎很奇怪。我对 PHP 开发(主要是 .NET 开发人员)相当陌生,所以我不确定是什么原因造成的。我不确定这是否是 PHP 或 Apache 或其他方面的差异。

编辑 我应该注意到我的服务器运行在某个品牌的 Linux 上,而开发机器是 Windows。在查看了 include_paths 后,我有一种与此有关的感觉。

【问题讨论】:

    标签: php apache include include-path


    【解决方案1】:

    我能想到的有几件事可能与这个问题有关。

    根据您的描述,我认为最有可能的是开发人员依赖 PHP 的 include_path 设置。此设置与require()include() 命令一起使用,告诉他们在没有提供硬路径的情况下在哪里查找请求的文件。如果代码使用相对路径,并且include_path 设置不同,则可能是个问题。通常include_path 将包含“当前目录”(即.)作为路径的一部分,并使用它作为基础来完成包含。

    另一种可能性是应用程序正在使用autoloading,并且不知何故这没有正确地转换为生产。我会快速搜索应用程序,看看是否指定了__autoload() 函数,或者使用了spl_autoload_register()。如果是这样,也许自动加载功能正在做出仅在开发机器上正确的目录假设?

    【讨论】:

    • 包含使用相对路径 (include_once("../classes/admin.php");)。我发现它也没有加载任何其他包含,所以它可能看起来像一个路径问题。我已经尝试在生产服务器上指定完整路径(即 include_once("SYS:/path/to/root/classes/admin.php");),但它仍然无法正常工作。包含路径(来自 get_include_path)是“.;sys:/php5/includes”。在整个代码中我根本没有找到任何对自动加载的引用。
    【解决方案2】:

    您应该检查包含路径,看看它为什么不能正常工作。包含路径信息将位于您的 PHP 配置文件(通常是 php.ini)以及应用程序本身中。在应用程序中,您可以尝试使用函数 get_include_path 并打印出它返回的内容。

    【讨论】:

    • 两个 php.ini 文件都没有指定 include_paths。当我在服务器上打印出 get_include_path 时,它显示“.;sys:/php5/includes”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    相关资源
    最近更新 更多