代码之家  ›  专栏  ›  技术社区  ›  jrharshath

包含路径解析如何在require_中工作一次?

  •  16
  • jrharshath  · 技术社区  · 16 年前

    /
        index.php
        f1/
            f1.php
        f2/
            f2.php
    

    index.php:

    <?php require_once("f1/f1.php"); ?>
    

    <?php require_once("../f2/f2.php"); ?>
    

    f2.php:空白

    现在,当我尝试在浏览器中打开index.php时,出现以下错误:

    Warning: require_once(../f2/f2.php) [function.require-once]: 
    failed to open stream: No such file or directory in /var/www/reqtest/f1/f1.php on line 2
    Fatal error: require_once() [function.require]: 
    Failed opening required '../f2/f2.php' (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/reqtest/f1/f1.php on line 2
    

    我有什么明显的遗漏吗?包含路径在PHP中是如何工作的?


    在我问这个问题之前,我试图通过实验来找出答案。我设置了另一个测试,如下所示:

    /
        index.php
        f1/
            f1.php
            f2.php
    

    index.php:

    <?php需要一次(“f1/f1.php”)&燃气轮机;
    

    <?php require_once("f2.php"); ?>
    

    f2.php:空白

    令我惊讶的是(和完全的困惑),这个结果很好!

    那么,路径解析背后的秘密是什么?

    PS我看到了 this question ,但它仍然不能回答我在这里提到的第二个案例。

    5 回复  |  直到 9 年前
        1
  •  12
  •   Karsten    16 年前

    如果包含另一个文件,工作目录将保留在包含文件所在的位置。

    您的示例正在按预期工作。

    编辑:

    编辑2: 在第二个示例中,您感兴趣的关键点是这一行:

    <?php require_once("f2.php"); ?>
    

    /var/www/req_path_test ),但找不到f2.php。

    作为回退,它将尝试在include_路径中查找f2.php( '.:/usr/share/php:/usr/share/pear' 实际的 一)。

    因此,“/f2.php”可以工作,并且require不会失败。

        2
  •  4
  •   Vladislav Rastrusny    16 年前

    require_once(dirname(__FILE__).'/../../test/file.php')
    

    但如果这些文件包含类,最好考虑使用AutoLoad。

        3
  •  0
  •   user207675    16 年前

    你的旧结构正常吗

    <?php require_once("f2/f2.php"); ?>

    <?php require_once("../f2/f2.php"); ?>

    应该有用。据我所知,php从初始脚本获取路径

        4
  •  0
  •   Emil Vikström    16 年前

    听起来你的服务器有 open_basedir

        5
  •  0
  •   Mohammad Daud Ibrahim    7 年前

    来自PHP文档 PHP include

    根据给定的文件路径包含文件,如果未给定,则根据指定的包含路径包含文件。如果在include_路径中找不到该文件,include将在失败之前最终签入调用脚本自己的目录和当前工作目录。

    如果没有给出文件路径,即require_once(“f2.php”);

    第二。已选中调用脚本自己的目录

    三,。最后检查当前工作目录

    如果定义的路径是绝对路径(在Windows或/在Unix/Linux系统上以驱动器号或\开头)还是相对于当前目录(以开始)。或..)包含路径将被完全忽略。例如,如果文件名以../开头,解析器将在父目录中查找请求的文件。

    如果您包括/需要以开头的文件。或或者./然后PHP的解析器将查找当前工作目录的父目录,即require_once(../f2/f2.PHP),PHP将在根目录检查调用脚本index.PHP所在的目录。

    现在您还没有在PHP脚本中定义任何包含路径,因此它总是返回到调用脚本,然后返回到当前工作目录。

    // Check your default include path, most likely to be C:\xampp\php\PEAR
    echo get_include_path();
    
    // To set include path
    set_include_path ( string $new_include_path ) : string
    

    当前工作目录是从主调用脚本index.php派生的。

    // The Current Working Directory can be checked
    echo getcwd();
    

    您的代码不起作用,因为-

    1. 当文件名以..开头时,PHP将忽略指定的路径/
    2. f1/调用脚本自己的目录也被忽略。
    3. 解析器目录查找父目录以查找请求的文件。当前工作目录是根目录,这是您启动工作脚本index.php的位置。文件不在此目录中,给出了错误的路径。

    这样你就得到了致命的错误

    在第二个示例中,您更改了目录&在f1.php中,您需要一次_(“f2.php”)。

    你的代码之所以有效是因为-

    1. 这一次您需要(“f2.php”)无前导../或/这一次php检查include_路径,但确实在那里找到了它,因为您尚未定义它,并且文件不位于默认预设的include_路径中。
    2. PHP不必在找到文件时检查工作目录。

    推荐文章