如何包含需要绝对路径的PHP文件?

php

128062 观看

11回复

54653 作者的声誉

我有一个像下面这样的目录结构;

script.php的

inc / include1.php
inc / include2.php

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

SOAP / 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]/"

作者: Xenph Yan 的来源 发布者: 2008 年 8 月 7 日

回应 (11)


5

7951 作者的声誉

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

作者: Ryan Fox 发布者: 07.08.2008 04:04

146

24737 作者的声誉

决定

这应该工作

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

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

编辑:通过aussieviking增加了改进

作者: Peter Coulton 发布者: 07.08.2008 04:20

6

7045 作者的声誉

看看http://au.php.net/reserved.variables

我认为你要找的变量是: $_SERVER["DOCUMENT_ROOT"]

作者: Christian Hagelid 发布者: 07.08.2008 04:25

43

9442 作者的声誉

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

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

文件的完整路径和文件名。如果在include中使用,则返回包含文件的名称。从PHP 4.0.2开始,__FILE__始终包含已解析符号链接的绝对路径,而在旧版本中,它在某些情况下包含相对路径。 (资源)

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

作者: Kevin 发布者: 07.08.2008 05:05

1

16860 作者的声誉

我认为最好的方法是将您的包含在PHP包含路径中。根据您的设置,有多种方法可以执行此操作。

然后你可以简单地参考

require_once 'inc1.php';

来自任何文件内部,无论它在您的包含位置或Web可访问文件中的位置,还是任何级别的嵌套子目录。

这允许您将包含文件放在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

作者: Polsonby 发布者: 07.08.2008 07:20

0

16860 作者的声誉

@Flubba,这允许我在include目录中有文件夹吗?平包括目录让我做恶梦。因为整个对象目录应该在inc目录中。

哦,是的,绝对的。例如,我们使用单层子文件夹,通常:

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

你需要小心在真正高流量的站点中依赖包含路径太多,因为php必须通过当前目录搜索,然后搜索包含路径上的所有目录,以查看你的文件是否在那里,这可能会慢如果你受到重创,事情就会发生。

因此,例如,如果您正在进行MVC,您可以在include路径中将应用程序的路径直接放入,然后指定引用表单中的内容

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

管他呢。

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

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

作者: Polsonby 发布者: 08.08.2008 11:17

2

71229 作者的声誉

另一个与Kevin相关的选项是use __FILE__,但是从其中替换php文件名:

<?php

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

?>

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

作者: Darryl Hein 发布者: 09.09.2008 10:49

5

5785 作者的声誉

处理此问题的另一种方法是删除对包含的任何需求,即使用自动加载功能。包括脚本需要的所有内容“Just in Case”会阻碍性能。如果您的包含都是类或接口定义,并且您只想在需要时加载它们,则可以__autoload()使用您自己的代码重载该函数以查找相应的类文件,并仅在调用它时加载它。以下是手册中的示例:

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

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

只要相应地设置include_path变量,就不需要再次包含类文件。

作者: Sam McAfee 发布者: 18.09.2008 02:28

2

29 作者的声誉

我发现这个工作非常好!

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

?>
作者: Thane Gill 发布者: 10.02.2012 07:00

1

0 作者的声誉

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

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

require(path_back()."/_resources/another_php_file.php");
作者: user4783311 发布者: 13.04.2015 02:33

0

51 作者的声誉

如果要在应用程序的大多数文件中包含特定路径,请在根文件夹中创建一个全局变量。

define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or 
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));

现在,每次包含新文件时,此全局变量“ APPLICATION_PATH ”可用于包含所有文件,而不是调用realpath()。

EX:

include(APPLICATION_PATH ."/config/config.ini";

希望能帮助到你 ;-)

作者: yuvraj 发布者: 09.05.2018 10:10
32x32