【问题标题】:How to include a file with relative path "upwards"如何包含相对路径“向上”的文件
【发布时间】:2023-04-06 05:19:01
【问题描述】:

我正在尝试包含这样一个简单的脚本:

ini_set('include_path', ini_get('include_path').':'.dirname(__FILE__));
include('../configuration/live/database.php');

当我运行脚本(使用 sudo)时,PHP 返回:

PHP 警告:include(../configuration/live/database.php):无法打开流:/home/adil/workspace-netbeans/trunk/applications/dudu/scripts/ejabberd_populate 中没有这样的文件或目录。 php 在第 17 行

为澄清起见,database.php 确实存在于

/home/adil/workspace-netbeans/trunk/applications/dudu/configuration/live/database.php

在我的脚本中,dirname(__FILE__) 返回

/home/adil/workspace-netbeans/trunk/applications/dudu/scripts

因此,以下工作:

include(dirname(__FILE__).'/../configuration/live/database.php')

我想了解的是为什么我的代码(使用 include_path)不起作用?有没有办法在 include_path 中查看包含文件是如何被搜索的?

同样的脚本在我们的生产服务器上运行得很好。它遵循相同的文件层次结构。

注意:最简单的解决方案是定义一个“SITE_ROOT”并预先添加包含,但这不是这篇文章的原因。我想知道为什么上述方法不起作用。

PS:我在 Ubuntu 10.04 上使用 PHP 5.3.2

【问题讨论】:

  • 顺便说一句,如何定义 SITE_ROOT?
  • Brian,SITE_ROOT 只是我定义的一个常量,它具有我的应用程序的绝对路径,如下所示:define('SITE_ROOT','/absolute/path/to/my/app/root/ ');

标签: php include


【解决方案1】:

你可以这样做:

require( dirname( dirname(__FILE__) ).'/configuration/live/master.php' );

如果你需要向上“更深”,只需包装更多的 dirname()

【讨论】:

    【解决方案2】:

    好的。终于找到问题了。

    我通过 shell 运行脚本,结果发现你的相对路径包括基于你在 shell 中的当前目录 (pwd) 的作品

    所以这段代码:

    sudo php workspace-netbeans/trunk/applications/dudu/scripts/ejabberd_populate.php 
    

    没有工作,因为我在 shell 中的密码是我的家,并且路径没有从那里解析。但是这个

    cd workspace-netbeans/trunk/applications/dudu/scripts/
    sudo php ejabberd_populate.php 
    

    有效。

    我不确定为什么 include_path 不起作用。

    谢谢大家,特别是。 Shrapnel 上校,感谢您帮助我解决了这个看似愚蠢的问题。

    【讨论】:

      【解决方案3】:

      上面的答案偏离了真正的问题。

      为了遇到类似问题的人,这里是直接的解决方案:

      require(dirname(__FILE__)."/../configuration/live/master.php");
      

      在 PHP 5.3 中你也可以这样做

      require(__DIR__."/../configuration/live/master.php");
      

      【讨论】:

        【解决方案4】:

        它不起作用,因为该文件不存在于该路径。

        【讨论】:

        • 它确实存在于 dirname(FILE).'../configuration/live/database.php'。即:'/home/adil/workspace-netbeans/trunk/applications/dudu/scripts/../configuration/live/database.php'
        • 所以脚本位于'/home/adil/workspace-netbeans/trunk/application/dudu/configuration/live/database.php'?
        • 优秀的答案。有时我们必须得到这样的。 @Adil 如果您尝试将两者都包括在内 - 一个完整的和一个相对的怎么办?只是检查自己。您的包含路径魔术无关紧要。只需设置正确的路径,相对于当前调用的脚本。你的问题不是什么特殊知识问题,只是多注意一点问题
        • @Col。弹片 - 我知道 require(DIR."/../configuration/live/master.php") 有效。我不需要“得到这样的”。再次阅读问题。为什么我的问题中的第一个代码语句不起作用。
        • @Adil 你已经得到了答案。 该文件在该路径中不存在。 请再次阅读。然后做一些调试来找出问题所在。包括完整的绝对路径是此类调查的一部分,而不是您可能认为的建议的解决方案。
        猜你喜欢
        • 2011-12-08
        • 1970-01-01
        • 2014-11-15
        • 1970-01-01
        • 2014-04-24
        • 1970-01-01
        • 2012-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多