关于PHP的一个有趣的事情是,如果你执行一个include / require,它将在文件所在的目录(或者更确切地说是请求的URI)之外工作。这意味着如果要包含更多文件,则无需知道原始脚本的运行位置。您需要知道的是当前脚本的位置。
现在我想加载一个文本文件并进行处理。 file_get_contents()似乎是一种加载它的obvioius方式。问题是我没有同样的奢侈品。我要么绝对指定文件路径,我不想做,或者我必须知道相对于发起调用的文件的位置,我也不喜欢。
要求/包括似乎不能与非PHP文件一起工作,并且本质上会回应内容(是的,我知道我可以将它包装在ob_start()等中。)
建议?
答案 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