代码之家  ›  专栏  ›  技术社区  ›  Xenph Yan

如何包含需要绝对路径的PHP文件?

php
  •  87
  • Xenph Yan  · 技术社区  · 17 年前

    我有如下目录结构:

    脚本语言

    包含1.php
    inc/include2.php(包含2.php)

    对象/object1.php
    对象/object2.php

    SOAP/SOAP.PHP

    现在,我在两者中都使用这些对象 script.php /soap/soap.php ,我可以移动它们,但出于特定的原因,我需要这样的目录结构。执行时 脚本语言 包含路径是 inc/include.php 在执行时 /SOAP/SOAP.PHP 它的 ../inc ,绝对路径工作, /mnt/webdev/[project name]/inc/include1.php... 但如果我想将目录移动到其他位置,这是一个很难看的解决方案。

    那么有没有一种使用相对路径的方法,或者一种编程生成 "/mnt/webdev/[project name]/" ?

    11 回复  |  直到 8 年前
        1
  •  142
  •   Community Mohan Dere    9 年前

    这应该管用

    $root = realpath($_SERVER["DOCUMENT_ROOT"]);
    
    include "$root/inc/include1.php";
    

    编辑: 增加蓄水量 aussieviking

        2
  •  42
  •   Ivan Akulov    8 年前

    可以使用相对路径。尝试 __FILE__ . 这是一个PHP常量,它总是返回其所在脚本的路径/文件名。所以,在 soap.php 你可以这样做:

    include dirname(__FILE__).'/../inc/include.php';
    

    的完整路径和文件名 文件。如果在include中使用, 返回包含文件的名称。 从php 4.0.2开始, 一个文件 总是 包含绝对路径 符号链接已解决,而在旧版本中 包含相对路径的版本 在某些情况下。 (source)

    另一个解决方案是 包含路径 在httpd.conf或.htaccess文件中。

        3
  •  7
  •   Andy    15 年前

    看一看 http://au.php.net/reserved.variables

    我想你要找的变量是: $_SERVER["DOCUMENT_ROOT"]

        4
  •  6
  •   Ryan Fox    17 年前

    您可以使用项目根目录的路径定义一个常量,然后将其放在路径的开头。

        5
  •  4
  •   Sam McAfee    17 年前

    另一种处理此问题的方法是使用 autoload 特征。包括脚本所需的一切“以防万一”可能会影响性能。如果include都是类或接口定义,并且只希望在需要时加载它们,则可以重载 __autoload() 函数与您自己的代码一起查找适当的类文件,并仅在调用时加载它。以下是手册中的示例:

    function __autoload($class_name) {
        require_once $class_name . '.php';
    }
    
    $obj  = new MyClass1();
    $obj2 = new MyClass2(); 
    

    只要您相应地设置include_路径变量,就不需要再包含类文件。

        6
  •  2
  •   HamZa    12 年前

    另一个与凯文有关的选择是使用 __FILE__ ,但要替换其中的php文件名:

    <?php
    
    $docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
    require_once($docRoot . '/lib/include.php');
    
    ?>
    

    我用这个已经有一段时间了。唯一的问题是有时你没有 $_SERVER['SCRIPT_NAME'] 但有时也有类似的另一个变量。

        7
  •  2
  •   Nisse Engström sting_roc    9 年前

    我觉得这个很管用!

    function findRoot() { 
        return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
    }
    

    用途:

    <?php
    
    function findRoot() {
        return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
    }
    
    include(findRoot() . 'Post.php');
    $posts = getPosts(findRoot() . 'posts_content');
    
    include(findRoot() . 'includes/head.php');
    
    for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
        $posts[$i]->displayArticle();
    }
    
    include(findRoot() . 'includes/footer.php');
    
    ?>
    
        8
  •  1
  •   Polsonby    17 年前

    我认为最好的方法是将include放在php include路径中。根据您的设置,有多种方法可以做到这一点。

    然后你可以简单地参考

    require_once 'inc1.php';
    

    从任何文件内部,不管它在include或web可访问文件中,或任何级别的嵌套子目录中的位置。

    这允许您将include文件放在Web服务器根目录之外,这是一种最佳实践。

    例如

    site directory
        html (web root)
            your web-accessible files
        includes
            your include files
    

    此外,还可以查看“自动加载”以延迟加载类文件

    http://www.google.com/search?q=setting+php+include+path

    http://www.google.com/search?q=__autoload

        9
  •  1
  •   Machavity Labib Hussain    11 年前
    require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");
    

    我使用这行代码。它返回到站点树的“顶部”,然后转到所需的文件。

    例如,假设我有这个文件树:

    域.com/aaa/index.php
    域.com/bbb/ccc/ddd/index.php
    domain.com//u resources/functions.php

    我可以在任何地方包含functions.php文件,只需复制粘贴即可。

    require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");
    

    如果需要多次使用此代码,可以创建一个函数,该函数返回 str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1)) 部分。然后只需将此函数插入到包含的第一个文件中。我有一个“initialize.php”文件,它包含在每个php页面的顶部,其中包含这个函数。下一次我必须包含文件时,实际上我只是使用函数 path_back ):

    require(path_back()."/_resources/another_php_file.php");
    
        10
  •  0
  •   Polsonby    17 年前

    @Flubba,这允许我在include目录中有文件夹吗?平面目录给我带来噩梦。因为整个对象目录应该在inc目录中。

    哦,是的,当然。例如,我们使用一层子文件夹,通常:

    require_once('library/string.class.php')
    

    在流量非常大的站点中,您需要小心过多地依赖include路径,因为php必须搜索当前目录,然后搜索include路径上的所有目录,以查看您的文件是否存在,如果您受到攻击,这可能会减慢速度。

    因此,例如,如果您正在执行MVC,您可以将指向应用程序Directoy的路径放在include路径中,然后在表单中指定refer to things

    'model/user.class'
    'controllers/front.php'
    

    或者什么。

    但是一般来说,它只允许你在PHP中使用非常短的路径,在任何地方都可以使用,而且它比所有realpath文档根目录错误都更容易阅读。

    其他人建议的基于脚本的替代方案的好处是它们可以在任何地方工作,甚至在共享框上;设置include路径需要更多的思考和努力,但是正如我提到的,可以让您开始使用最酷的自动加载。

        11
  •  0
  •   yuvraj    8 年前

    如果要在应用程序中的大多数文件中包含特定路径,请为根文件夹创建一个全局变量。

    define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
    or 
    define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));
    

    现在这个全局变量” 应用程序路径 “每次包含新文件时,都可以使用包含所有文件,而不是调用realpath()。

    前任:

    include(APPLICATION_PATH ."/config/config.ini";
    

    希望有帮助;—)

    推荐文章