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

时间:2009-02-06 14:12:29

标签: php

关于PHP的一个有趣的事情是,如果你执行一个include / require,它将在文件所在的目录(或者更确切地说是请求的URI)之外工作。这意味着如果要包含更多文件,则无需知道原始脚本的运行位置。您需要知道的是当前脚本的位置。

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

要求/包括似乎不能与非PHP文件一起工作,并且本质上会回应内容(是的,我知道我可以将它包装在ob_start()等中。)

建议?

10 个答案:

答案 0 :(得分:9)

您可以使用

获取与当前文件关联的目录
dirname(__FILE__)

所以你可以这样做:

file_get_contents(dirname(__FILE__) . '/foo.txt')

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

如果我正确理解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()都会始终考虑当前目录。

答案 4 :(得分:0)

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

一样简单

我不知道你怎么知道要包含哪个文件。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

你想要

$_SERVER['DOCUMENT_ROOT'];

答案 7 :(得分:0)

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

  

首先在相对于当前工作目录的每个include_path条目中查找包含文件,然后在当前脚本的目录中查找。例如。如果您的include_path是库,则当前工作目录为/www/,您包含include/a.php且该文件中有include "b.php"b.php首先在/www/libraries/中查找1}}然后在/www/include/。如果filename./../开头,则仅在当前工作目录中查看。 - http://docs.php.net/include

但是使用绝对路径更好,因此PHP不需要“猜测”意味着哪个文件。

答案 8 :(得分:0)

为了回答你的问题,在我看来,你需要编写自己的include等价物来从任意数量的可能路径返回文件内容。在数组中配置一系列路径并使函数循环通过它,使用file_exists()并在找到文件时加载文件内容。

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

另请注意,文件系统路径分隔符有php常量,例如: DIRECTORY_SEPARATOR,但是您不需要它用于可移植文件路径,因为正斜杠“/”适用于Windows。

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

$path = realpath(dirname(__FILE__)).'/whatever.txt';

答案 9 :(得分:0)

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

你需要在你试图加载的文件中放入'{include file =“relative / file / path.ext”}',但是smarty至少会处理所有相对路径对你来说很困惑。

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