PHP中路径问题的解决方案

转载 2006年06月09日 13:23:00
PHP中路径问题的解决方案
引言:
关于PERL与PHP中的包含路径一直是一个比较难解的问题,主要是与操作系统和WEB服务器有关,不可能非常智能化的解决这个路径问题。相对于PERL,PHP的路径好得多,解决起来也容易得多,因为PHP的相对路径在PHP程序中的任何场合都可以使用,而不象PERL在某些语句中必须用绝对路径而导致移植的极其复杂。

基于此,在PHP中,我设计了一个绝对稳妥的解决方案,如下所述。

原则:
使用相对路径,但在相对路径中用绝对路径(有点绕,待会儿详解),一是可以保证可移植性,二是可以方便地修改,三是公式化且结构清晰明了,易于扩展。

步骤详解:
1、先确定好一个程序的根目录,注意是文件系统下的,不是WEB服务器下的虚拟目录,不过一般情况下该目录下的子目录的相对路径与URL下该目录的虚拟子目录是相同的。
2、在定义好的程序根目录下的每个子目录下(其实不一定是每个,根据需要)建立一个settings.php,里面定义一个变量或是常数(常数比较好,因为作用域比较大),如APPROOT,但这个APPROOT却不是绝对路径,而是该目录相对于你指定的程序根目录的相对路径。
3、在此目录下的所有程序入口文件(也即第一个包含其它文件的文件,或是允许直接在浏览器中浏览的文件)中第一句写上require_once('settings.php');,但要注意,所有被包含文件最好不要加此句——其实加上也可以,因为你可以在settings.php中写上 if(!defined(APPROOT)) define(APPROOT, '../..');这类的语句以防重定义。
4、如果你要包含其它文件,无论是直接还是间接地包含,都可以写成 include(APPROOT.$path);,这里$path为被包含文件相对于你所指定的程序根目录的绝对路径。

原理:
定下的程序根目录是相对路径,但具体的目录位置是相对于那个根目录的绝对路径,两者组合起来就是具体文件相对于程序根目录的相对路径了。例如目录c:/wwwroot/app为你指定的程序根目录,然后有这么两个文件c:/wwwroot/app/a/index.php和c:/wwwroot/app/b/inc.php。对子目录a来说,APPROOT是'..',而对程序根目录来说,inc.php的绝对路径是$path='/b/inc.php',两者组合为'../b/inc.php'。如果要在index.php中包含inc.php就要写成include('../b/inc.php');,而这个路径不就正好是刚才组合而成的APPROOT.$path吗?


结论:
经过以上处理,各个路径绝对整齐划一,唯一罗嗦一点的就是每个目录下要定义一下这个APPROOT,但每个目录下只需在本目录的settings.php中定义一次就足够了。如果你整个程序只有一个入口文件,如index.php,而其它文件全部都是直接或是间接地被包含进这个唯一的入口文件的话,就只需在index.php的所在目录下的settings.php中定义一次就OK了。如果有朋友做过Delphi的工程并对工程文件研究过的话,就会发现我刚才说的一个程序只有一个主入口文件的情况与Delphi的工程十分相似,因为Delphi除了一个主程序文件(dpr文件),其余的全部是单元文件或是资源文件,都不能独立执行。在PHP中,如果这种情况出现,只需定义一次APPROOT,并在主程序文件中第一句话写成require_once('settings.php');,而以后所有的包含全都可以用include(APPROOT.$path);,就保证不会有任何问题,除非你不会写这个“包含文件相对于程序根目录的绝对路径”$path。

这个方法我用了不止一次,收效很好。另外还可以参考JSP的WEB-INFO中路径的定义方式。

我这个是以不变应万变的公式化的方案,如果有朋友有更好的方案,欢迎提出讨论!如有不明白的也欢迎提出。

php解决问题的方法

这篇文章的原标题是“关于PHP程序员解决问题的能力”但是我认为这更是一篇phper解决问题方法的好文章(原文地址:http://rango.swoole.com/archives/340)。这个话题老...
  • leedaning
  • leedaning
  • 2015年11月23日 09:49
  • 570

php文件之间相互引用路径问题的一般处理方法

基础知识    /前面的点式来表现路径的地址,一般来说都是相对路径 因为当你的文件上到外网上以后,你本地的路径可能和外网的路径不同 所以不能用绝对路径,用相对路径就可以找到文件 一...
  • g397388093
  • g397388093
  • 2015年01月25日 12:02
  • 5620

Java路径问题最终解决方案

—可定位所有资源的相对路径寻址  前言 Java的路径问题,非常难搞。最近的工作涉及到创建和读取文件的工作,这里我就给大家彻底得解决Java路径问题。 我编写了一个方法,比ClassLoader...
  • mycomputerxiaomei
  • mycomputerxiaomei
  • 2014年04月25日 14:42
  • 1211

关于php高并发解决的一点思路

涉及抢购、秒杀、抽奖、抢票等活动时,为了避免超卖,那么库存数量是有限的,但是如果同时下单人数超过了库存数量,就会导致商品超卖问题。那么我们怎么来解决这个问题呢,我的思路如下(伪代码):  sql...
  • mkbug
  • mkbug
  • 2017年05月09日 14:22
  • 4188

JAVA路径问题的解决方案

Java路径问题最终解决方案                                                                                      ...
  • u010034351
  • u010034351
  • 2014年03月05日 10:57
  • 489

PHP大量用户登录解决方案

百度、QQ、360等大公司都拥有上亿的用户量。不仅所有子网站都通过一个账号登录,而且还开放用户平台,提供给其他网站使用。这种级别的数据量和访问量如果不做优化,估计很快就会宕机。这些公司都是一个专门的团...
  • superbirds
  • superbirds
  • 2016年07月18日 16:59
  • 331

CSS、JS中的相对路径引用

CSS、JS中的相对路径引用   初学者由于对一些比较基本的知识的把握不是很牢,所以在开发或者设计的时候,往往很容易出现一些错误或者异常现象而找不到出错的根源。记得自己刚刚java入门的时候,会...
  • xingxing513234072
  • xingxing513234072
  • 2013年07月23日 15:39
  • 7304

php高并发秒杀解决方案

在秒杀、抢火车票等地方,我们通常用遇到这样高并发的问题,下面我提供了四种解决方案: 1、使用文件锁 $fp = fopen("order.lock", "r"); if(flock($fp,LOCK_...
  • super_runman
  • super_runman
  • 2016年11月04日 17:20
  • 13340

PHP文件路径解析

php中include包含文件路径查找过程 首先,“路径”分为三种: 1、绝对路径,以/开头(unix系统)或c:等盘符开头(windows系统)。 2、相对路径,以...
  • u013782203
  • u013782203
  • 2016年11月06日 00:20
  • 2503

CI去除index.php和引入文件的路径问题

修改apache的配置文件 打开httpd.conf文件 将这句话前面的#号去掉 LoadModule rewrite_module modules/mod_rewrite.so CI根目录下...
  • sinat_21125451
  • sinat_21125451
  • 2016年04月25日 13:10
  • 1880
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PHP中路径问题的解决方案
举报原因:
原因补充:

(最多只允许输入30个字)