1、使用绝对路径包含文件
在每次对文件的包含中,都使用系统绝对路径进行包含,比如 require('/var/www/html/inc/test.inc');的方式,在所有文件中都这样包含就可以避免多级包含出现的问题,但是这中方式不灵活,系统可移植性极差,建议不采用。
2、在一个公用文件中定义公用文件的列表,将各个公用文件的完整路径定义为变量或者宏,系统中各个文件采用相对路径的方式包含此公用文件,然后使用变量包含需要包含的文件,这样可以实现统一维护一个文件即可,但是这种方式感觉仍然不是很爽,移植起来修改的地方仍然较多。
3、将所有的程序放到一个目录下,这样所有的包含调用都使用当前路径,就避免了路径问题,这种方式在很多开源的论坛程序中较多采用,但是这样的结构对比较大型和复杂的系统应用存在明显的不足。
4、修改php.ini文件,在php.ini中设置 include_path项,将所有的公用文件和需要进行调用包含的文件路径写进这个设置项里,这样在程序中无论当前文件在什么路径,均采用当前路径的方式进行包含,这个和PHP的PEAR安装和调用方式一样,这中方式实现简单,移植性强,建议采用。
http://www.xiangdong.org/blog/read.php/1210.htm
5、最后一种方式,也是采用公用文件定义路径的方式,这也是我常使用的方式,在我的应用中定义一个path.php文件,在文件中定义当前应用的全局路径变量 $ROOT_PATH,所有的应用文件都调用和包含path.php文件,这个文件可以放到php.ini的include_path设置的目录下,也可以放到系统根 /下,也可以放到任何地方,只要的相对固定的,建议放到include_path定义的目录下,path.php文件根据当前访问的页面相对的PHP_SELF值取得路径信息,然后通过计算的方式得出到网站相对根目录的相对路径,下面是我的path.php文件的计算$ROOT_PATH值的方式:
/**
* 获取当前文件同指定网站相对根目录的目录层数 $ROOT_PATH
* $ROOT_PATH 变量值末尾包含了路径的"/"符号,在引用时不要再加"/"
* example: $ROOT_PATH."images/logo.gif"
*/
$_self_path = ($_SERVER['PHP_SELF'] == "" )? $_SERVER['REQUEST_URI'] : $PHP_SELF;
$_path_array = explode("/",$_self_path);
$_path_count = count($_path_array);
$ROOT_PATH = "";
for ($i=0;$i<$_path_count-2;$i++)
{
$ROOT_PATH = '../'.$ROOT_PATH;
}
这个$ROOT_PATH可以在系统任何地方使用,只需要在后面跟上目标文件相对网站目录根的相对路径即可,比如 $ROOT_PATH.'/images/test.gif'
两者前者使用相对路径后者使用绝对路径
如果包含只有一层 那么两种方法效果是一样的 绝对路径 执行效率应该稍为高些
如果在包含的文件下再包含那么效果就不一样了 相对路径会以最后包含的文件为参照物寻找路径
绝对路经就不存在这个问题
下面做个实验
<?php
# /url.php
echo $_SERVER['DOCUMENT_ROOT']."<br>"; //获得服务器文档根
echo $_SERVER['PHP_SELF']."<br>"; //获得执行该代码的文件服务器绝对路径
echo __FILE__."<br>"; //获得文件的文件系统绝对路径
echo dirname(__FILE__); //获得文件所在的文件夹路径
require ("./ch/1.php");
?>
<?php
# /ch/1.php
echo "<br> 我是 1 </br>";
$thisPath = dirname(__FILE__);
echo "我要包含文件2";
include ("./2.php"); //路径错误
include ($thisPath."/2.php"); //路径正确
?>
<?
# /ch/2.php
echo "<br>我是 2 </br>";
?>
当项目的目录层次超过两层并且需要出现文件的多层嵌套的时候 使用绝对地址定位文件位置就非常重要了。
一般我的做法是在一个全局配置文件中 存储 各种必须文件夹的绝对路径.
在每次对文件的包含中,都使用系统绝对路径进行包含,比如 require('/var/www/html/inc/test.inc');的方式,在所有文件中都这样包含就可以避免多级包含出现的问题,但是这中方式不灵活,系统可移植性极差,建议不采用。
2、在一个公用文件中定义公用文件的列表,将各个公用文件的完整路径定义为变量或者宏,系统中各个文件采用相对路径的方式包含此公用文件,然后使用变量包含需要包含的文件,这样可以实现统一维护一个文件即可,但是这种方式感觉仍然不是很爽,移植起来修改的地方仍然较多。
3、将所有的程序放到一个目录下,这样所有的包含调用都使用当前路径,就避免了路径问题,这种方式在很多开源的论坛程序中较多采用,但是这样的结构对比较大型和复杂的系统应用存在明显的不足。
4、修改php.ini文件,在php.ini中设置 include_path项,将所有的公用文件和需要进行调用包含的文件路径写进这个设置项里,这样在程序中无论当前文件在什么路径,均采用当前路径的方式进行包含,这个和PHP的PEAR安装和调用方式一样,这中方式实现简单,移植性强,建议采用。
http://www.xiangdong.org/blog/read.php/1210.htm
5、最后一种方式,也是采用公用文件定义路径的方式,这也是我常使用的方式,在我的应用中定义一个path.php文件,在文件中定义当前应用的全局路径变量 $ROOT_PATH,所有的应用文件都调用和包含path.php文件,这个文件可以放到php.ini的include_path设置的目录下,也可以放到系统根 /下,也可以放到任何地方,只要的相对固定的,建议放到include_path定义的目录下,path.php文件根据当前访问的页面相对的PHP_SELF值取得路径信息,然后通过计算的方式得出到网站相对根目录的相对路径,下面是我的path.php文件的计算$ROOT_PATH值的方式:
/**
* 获取当前文件同指定网站相对根目录的目录层数 $ROOT_PATH
* $ROOT_PATH 变量值末尾包含了路径的"/"符号,在引用时不要再加"/"
* example: $ROOT_PATH."images/logo.gif"
*/
$_self_path = ($_SERVER['PHP_SELF'] == "" )? $_SERVER['REQUEST_URI'] : $PHP_SELF;
$_path_array = explode("/",$_self_path);
$_path_count = count($_path_array);
$ROOT_PATH = "";
for ($i=0;$i<$_path_count-2;$i++)
{
$ROOT_PATH = '../'.$ROOT_PATH;
}
这个$ROOT_PATH可以在系统任何地方使用,只需要在后面跟上目标文件相对网站目录根的相对路径即可,比如 $ROOT_PATH.'/images/test.gif'
两者前者使用相对路径后者使用绝对路径
如果包含只有一层 那么两种方法效果是一样的 绝对路径 执行效率应该稍为高些
如果在包含的文件下再包含那么效果就不一样了 相对路径会以最后包含的文件为参照物寻找路径
绝对路经就不存在这个问题
下面做个实验
<?php
# /url.php
echo $_SERVER['DOCUMENT_ROOT']."<br>"; //获得服务器文档根
echo $_SERVER['PHP_SELF']."<br>"; //获得执行该代码的文件服务器绝对路径
echo __FILE__."<br>"; //获得文件的文件系统绝对路径
echo dirname(__FILE__); //获得文件所在的文件夹路径
require ("./ch/1.php");
?>
<?php
# /ch/1.php
echo "<br> 我是 1 </br>";
$thisPath = dirname(__FILE__);
echo "我要包含文件2";
include ("./2.php"); //路径错误
include ($thisPath."/2.php"); //路径正确
?>
<?
# /ch/2.php
echo "<br>我是 2 </br>";
?>
当项目的目录层次超过两层并且需要出现文件的多层嵌套的时候 使用绝对地址定位文件位置就非常重要了。
一般我的做法是在一个全局配置文件中 存储 各种必须文件夹的绝对路径.
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/1211/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2008-8-27 18:29
评论列表