2008-08-07 68 views
82

我有一个如下的目录结构;如何包含需要绝对路径的PHP文件?

的script.php

INC/include1.php
INC/include2.php

对象/ object1.php
对象/ object2.php

皂/ soap.php

现在,我使用这些对象在script.php/soap/soap.php,我可以移动它们,但是我想要一个特定原因的目录结构。当执行script.php时,包含路径是inc/include.php,执行时/soap/soap.php../inc,绝对路径有效,/mnt/webdev/[project name]/inc/include1.php...但是如果我想将目录移动到不同的位置,这是一个丑陋的解决方案。

那么有没有办法使用相对路径,或者一种方式来编程生成"/mnt/webdev/[project name]/"

回答

138

这应该工作

$root = realpath($_SERVER["DOCUMENT_ROOT"]); 

include "$root/inc/include1.php"; 

编辑:通过aussieviking

+0

要小心,如果您通过Web服务器执行该脚本,该脚本将填充`DOCUMENT_ROOT` – Phil 2013-12-22 23:03:37

+0

只是一个问题,为什么RealPath()为$ _SERVER [“DOCUMENT_ROOT”]?这不应该总是输出规范的路径吗? – 2015-11-15 00:30:30

6

您可以使用到项目根目录的路径定义常量,然后将其放在路径的开头。

40

您可以使用相对路径。尝试__FILE__。这是一个PHP常量,它总是返回脚本它是在路径/文件名,以便在soap.php,你可以这样做:

include dirname(__FILE__).'/../inc/include.php'; 

的完整路径和文件 的文件名。如果在包含内部使用,则会返回包含文件的名称 。 由于PHP 4.0.2,__FILE__总是 包含一个绝对路径, 符号链接已解决,而在旧版本的 版本中,它在一些情况下包含相对路径 。 (source)

另一个解决方案是设置一个包括在httpd.conf或.htaccess文件路径

1

我认为最好的方法是把你的包含在你的PHP包含路径中。根据您的设置,有多种方法可以做到这一点。

然后,你可以简单地从任意文件中参考

require_once 'inc1.php'; 

无论在哪里,它是你是否具备或在你的网络访问文件,或嵌套子目录的任何水平。

这使您可以将您的包含文件放在Web服务器根目录之外,这是最佳做法。

例如

site directory 
    html (web root) 
     your web-accessible files 
    includes 
     your include files 

此外,检查出__autoload类文件

http://www.google.com/search?q=setting+php+include+path

http://www.google.com/search?q=__autoload

0

@Flubba的延迟加载,这也让我有文件夹在我的include目录?平面包含目录给我做恶梦。因为整个对象目录应该位于inc目录中。

哦,是的,绝对。因此,例如,我们用的子文件夹的单层,一般为:

require_once('library/string.class.php') 

你必须要小心,依托包括路径非常高流量的网站太多了,因为PHP已经通过当前目录打猎和然后在包含路径中的所有目录,以查看您的文件是否在那里,如果您受到敲打,这可能会减慢速度。

因此,举例来说,如果你正在做的MVC,你把路径应用程序directoy在包括路径,然后指定是指事物的形式

'model/user.class' 
'controllers/front.php' 

或什么的。

但是一般来说,它只是让你在你的PHP中使用真正短的路径工作,它可以在任何地方工作,并且比所有实际路径文档根malarkey更容易阅读。

其他人建议的那些基于脚本的替代方案的好处是它们可以在任何地方工作,即使在共享的盒子上也是如此;设置包含路径需要多一点思考和努力,但正如我提到的,让你开始使用最酷的__autoload。

3

另一种选择,与凯文的,是用__FILE__,而是从内它替换php文件名:

<?php 

$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__); 
require_once($docRoot . '/lib/include.php'); 

?> 

我一直在使用这一段时间。唯一的问题是有时你没有$_SERVER['SCRIPT_NAME'],但有时候会有另一个变量类似。

4

解决这个问题的另一种方法是删除任何需要包含的东西,即使用autoload功能。包括您的脚本需要的一切“在案例中”可能会妨碍性能。如果您的包含文件全部是类或接口定义,并且只想在需要时加载它们,则可以使用自己的代码重载__autoload()函数以查找适当的类文件并仅在调用它时加载它。下面是从手册中的例子:

function __autoload($class_name) { 
    require_once $class_name . '.php'; 
} 

$obj = new MyClass1(); 
$obj2 = new MyClass2(); 

只要你设置你的include_path变量,因此,您再也不需要包含类文件。

3

我发现这个工作得很好!

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'); 

?> 
2
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
域。 COM/_resources/functions.php中

我可以包括从不管我在哪里的functions.php文件,只需通过复制粘贴

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php"); 

如果您需要多次使用此代码,您可以创建一个函数返回str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))部分。然后在你包含的第一个文件中插入这个函数。我有一个“initialize.php”文件,我将它包含在每个php页面的顶部,并包含这个函数。接下来的时间,我必须包括文件,我其实只是使用功能(命名path_back):

require(path_back()."/_resources/another_php_file.php"); 
0

较短方式

include($_SERVER['DOCUMENT_ROOT']."/inc/include1.php"); 

“DOCUMENT_ROOT”:文档根目录下,其正如服务器的配置文件中所定义的,当前脚本是 正在执行。

相关问题