如何包含需要绝对path的PHP文件?
我有一个如下的目录结构;
script.php的
INC / include1.php
INC / include2.php对象/ object1.php
对象/ object2.phpSOAP / soap.php
现在,我在script.php
和/soap/soap.php
使用这些对象,我可以将它们移动,但是由于特定的原因我想要这样的目录结构。 当执行script.php
,includepath是inc/include.php
,当执行/soap/soap.php
它是../inc
,绝对path工作, /mnt/webdev/[project name]/inc/include1.php...
但是如果我想将目录移动到不同的位置,这是一个难看的解决scheme。
那么有没有办法使用相对path,或者是以编程的方式生成"/mnt/webdev/[project name]/"
?
这应该工作
$root = realpath($_SERVER["DOCUMENT_ROOT"]); include "$root/inc/include1.php";
编辑:通过aussieviking添加imporvement
你可以使用相对path。 试试__FILE__
。 这是一个PHP常量,它总是返回它所在脚本的path/文件名。所以,在soap.php
,你可以这样做:
include dirname(__FILE__).'/../inc/include.php';
文件的完整path和文件名。 如果在include中使用,则返回包含文件的名称。 从PHP 4.0.2开始,
__FILE__
总是包含一个parsing了符号链接的绝对path,而在旧版本中,它包含了在某些情况下的相对path。 (资源)
另一个解决scheme是在你的httpd.conf或.htaccess文件中设置includepath 。
看看http://au.php.net/reserved.variables
我认为你正在寻找的variables是: $_SERVER["DOCUMENT_ROOT"]
你可以定义一个常量到项目根目录的path,然后把它放在path的开头。
解决这个问题的另一种方法就是使用自动加载function。 包括您的脚本需要的一切“在情况下”可能会阻碍性能。 如果你的包含的都是类或接口的定义,并且你只想在需要的时候加载它们,你可以用你自己的代码重载__autoload()
函数来find合适的类文件,并且只有在被调用的时候才加载它。 以下是手册中的示例:
function __autoload($class_name) { require_once $class_name . '.php'; } $obj = new MyClass1(); $obj2 = new MyClass2();
只要您相应地设置了include_pathvariables,就不需要再次包含类文件。
另一个与凯文相关的选项是使用__FILE__
,而不是从其中取代php文件名:
<?php $docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__); require_once($docRoot . '/lib/include.php'); ?>
我一直在使用这个。 唯一的问题是有时你没有$_SERVER['SCRIPT_NAME']
,但有时候会有另外一个variables类似。
我发现这个工作得很好!
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'); ?>
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");
我使用这行代码。 它返回到站点树的“顶部”,然后转到所需的文件。
例如,假设我有这个文件树:
domain.com/aaa/index.php
domain.com/bbb/ccc/ddd/index.php
domain.com/_resources/functions.php
我可以从任何地方包括functions.php文件,只需通过复制粘贴即可
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");
如果你需要多次使用这个代码,你可以创build一个返回str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))
部分str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))
。 然后,只需在你包含的第一个文件中插入这个函数。 我有一个“initialize.php”文件,我包括在每个PHP页面的顶部,其中包含此function。 下一次我必须包含文件,我实际上只是使用函数(名为path_back
):
require(path_back()."/_resources/another_php_file.php");
我认为最好的方法是把你的包含在你的PHP包含path。 有多种方法可以根据您的设置来执行此操作。
那么你可以简单地参考
require_once 'inc1.php';
从任何文件的内部,无论是在你的包含或在你的网页访问文件,或任何级别的嵌套子目录。
这使您可以将您的包含文件放在Web服务器根目录之外,这是最佳做法。
例如
site directory html (web root) your web-accessible files includes your include files
此外,检查出__autoload延迟加载类文件
@Flubba,这是否允许我在我的包含目录中的文件夹? 平面包含目录给我做恶梦。 因为整个对象目录应该位于inc目录中。
哦,是的,绝对。 因此,例如,我们使用单层子文件夹,通常:
require_once('library/string.class.php')
在真正高stream量的站点上,你需要非常小心地使用包含path,因为php不得不search当前目录,然后search包含path上的所有目录,以查看你的文件是否存在,事情起来,如果你正在锤打。
所以,举个例子,如果你在做MVC,你会把path放到你的应用程序中,在includepath中,然后指定表单中的东西
'model/user.class' 'controllers/front.php'
pipe他呢。
但是一般来说,它只是让你在你的PHP中使用真正短的path,它可以在任何地方工作,而且比实际path的文档根目录malarkey更容易阅读。
其他人提出的基于脚本的替代scheme的好处是他们可以在任何地方工作,甚至在共享的盒子上工作。 设置包含path需要更多的思想和努力,但正如我所提到的,让你开始使用__autoload这是最酷的。
更短的路
include($_SERVER['DOCUMENT_ROOT']."/inc/include1.php");
'DOCUMENT_ROOT':在服务器configuration文件中定义的当前脚本执行的文档根目录。