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

在不知道底层文件系统的情况下在PHP中加载文件

php
  •  0
  • cletus  · 技术社区  · 16 年前

    PHP的一个特点是,如果你使用include/require,它会在文件所在的目录(或者更确切地说是请求的URI)下工作。这意味着,如果你想包含更多的文件,你不需要知道原始脚本是从哪里运行的。你只需要知道当前脚本在哪里。

    现在我想加载一个文本文件并对其进行处理。file_get_contents()似乎是一种显而易见的加载方式。问题是我没有同样的奢侈。我要么需要绝对指定文件路径,这是我不想做的,要么我必须知道相对于发起调用的文件的位置,这也是我不喜欢的。

    Require/include似乎不适用于非PHP文件,这基本上会与内容相呼应(是的,我知道我可以把它包装在ob_start()中,等等)。

    建议?

    10 回复  |  直到 16 年前
        1
  •  9
  •   Grey Panther    16 年前

    您可以使用以下命令获取与当前文件关联的目录

    dirname(__FILE__)
    

    所以你可以这样做:

    file_get_contents(dirname(__FILE__) . '/foo.txt')
    
        2
  •  1
  •   Karmic Coder    16 年前

    使用您所需的文件路径定义一个常量,无论您通常将配置设置放在哪里。保持简单和可定制。

        3
  •  1
  •   Zachery Delafosse    16 年前

    首先,请注意,“相对路径”将来自当前运行的第一个php脚本的路径所在的位置(无论哪个文件可能正在执行包含操作)。无法指定相对路径听起来很奇怪。。。

        4
  •  1
  •   cg.    16 年前

    如果我理解以下文档 file_get_contents 没错,你可以直接通过 true 作为第二个参数 include_path 将被使用。所以,在我的系统上

    echo file_get_contents('doc/DB/doc/STATUS', true);
    

    将从我的PEAR模块中回显STATUS文档,因为/usr/share/PEAR位于我的include_path中。当我们讨论这个问题时,我不相信include()或require()也能在相对路径上工作,除非。'是include_path的一部分。我去查查。

    更新:好的,我查过了。事实证明,无论include_path怎么说,include()也将始终考虑当前目录。

        5
  •  0
  •   tkotitan    16 年前

    在网站世界中,必须了解事物的发展路径是很常见的。您可以将路径的一部分(如开头)存储在配置变量中,例如$config['include_dir'];指定文件的路径就像说include一样简单($_SERVER['DOCUMENT_ROOT'].'/include/myinclude.inc.php');

    我不知道你怎么知道要包括什么文件。

        6
  •  0
  •   Kevin Tighe    16 年前

    打开文件需要绝对路径。您可以使用realpath()将相对url路径转换为绝对路径。

        7
  •  0
  •   jacobangel    16 年前

    查看$_SERVER属性。 http://us2.php.net/manual/en/reserved.variables.server.php

    你想要的

    $_SERVER['DOCUMENT_ROOT'];
    
        8
  •  0
  •   Gumbo    16 年前

    require / include 正在解析当前脚本文件和初始执行的脚本文件这两个路径的绝对路径:

    首先在每个文件中查找包含的文件 include_path 条目相对于当前工作目录,然后在当前脚本的目录中。例如,如果你 include_path 是库,当前工作目录是 /www/ ,你包括 include/a.php include "b.php" 在该文件中, b.php 先看进去 /www/libraries/ 然后在 /www/include/ .如果 filename 开始于 ./ ../ ,仅在当前工作目录中查看。 http://docs.php.net/include

    但是使用绝对路径更好,所以PHP不需要猜测哪个文件是指哪个文件。

        9
  •  0
  •   Ceilingfish    16 年前

    我不知道您是否可以控制要加载的文件的内容,但如果可以,您可以尝试使用smarty模板引擎( http://www.smarty.net/ )

    您需要在尝试加载的文件中添加“{include file=“relative/file/path.ext”}”,但smarty至少会为您处理所有相对路径和混淆。

    PS:包含标签的文档在这里: http://www.smarty.net/manual/en/language.function.include.php

        10
  •  0
  •   nickf    16 年前

    为了回答你的问题,在我看来,你需要编写自己的包含等效代码,以从任意数量的可能路径返回文件内容。在数组中配置一系列路径,并让你的函数循环遍历它,使用file_exists(),如果找到文件,则加载文件内容。

    文件系统功能: http://us2.php.net/manual/en/ref.filesystem.php#73954

    另请注意,文件系统路径分隔符有php常量,例如: DIRECTORY_SEPERATOR,但是对于可移植文件路径,您并不真正需要它,因为正斜杠“/”在Windows上工作。

    Ps:Symfony中经常使用的获取绝对路径的技巧是:

    $path = realpath(dirname(__FILE__)).'/whatever.txt';
    
    推荐文章