欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

为什么PHP的主流框架和CMS采用绝对路径而不是相对路径?

程序员文章站 2024-01-06 22:28:34
...
按理说,相对路径遍历的目录比绝对路径要少呀。 比如../admin/明显要比c:/wamp/www/cms/templates/admin/遍历的目录少。

情境:使用include(_once),require(_once)时。

注: 此处所指的绝对路径是指服务器使用的是文件的物理路径(也称为根相对路径),无论是使用"__DIR__"还是一个变量。 此处所指的相对路径是目录相对路径(./xxx.php),不是文件名的相对路径(xxx.php)。

可能性1:使用相对路径会解析成绝对路径再执行。

结果:手册上表示相对路径不会被解析成绝对路径@jackeychen

可能性2:include_path()对效率会有影响。

结果:手册上说明除了类似于xxx.php的文件名之外,只要是路径,就不会再使用includepath()(但是@zhaoyi指出php5.2之前相对路径还是会受includepath影响,Laruence在10年的一片文章也提到相对路径受到include_path的影响(其实他指的是文件名的相对目录))

附1:PHP手册 include函数:被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 includepath 指定的目录寻找。如果在 includepath 下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找。如果最后仍未找到文件则 include 结构会发出一条警告;这一点和 require 不同,后者会发出一个致命错误。如果定义了路径——不管是绝对路径(在 Windows 下以盘符或者 \ 开头,在 Unix/Linux 下以 / 开头)还是当前目录的相对路径(以 . 或者 .. 开头)——include_path 都会被完全忽略。例如一个文件以 ../ 开头,则解析器会在当前目录的父目录下寻找该文件。

附2:参考文章 《深入理解PHP之require/include顺序》 from Laruence.

回复内容:

按理说,相对路径遍历的目录比绝对路径要少呀。 比如../admin/明显要比c:/wamp/www/cms/templates/admin/遍历的目录少。

情境:使用include(_once),require(_once)时。

注: 此处所指的绝对路径是指服务器使用的是文件的物理路径(也称为根相对路径),无论是使用"__DIR__"还是一个变量。 此处所指的相对路径是目录相对路径(./xxx.php),不是文件名的相对路径(xxx.php)。

可能性1:使用相对路径会解析成绝对路径再执行。

结果:手册上表示相对路径不会被解析成绝对路径@jackeychen

可能性2:include_path()对效率会有影响。

结果:手册上说明除了类似于xxx.php的文件名之外,只要是路径,就不会再使用includepath()(但是@zhaoyi指出php5.2之前相对路径还是会受includepath影响,Laruence在10年的一片文章也提到相对路径受到include_path的影响(其实他指的是文件名的相对目录))

附1:PHP手册 include函数:被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 includepath 指定的目录寻找。如果在 includepath 下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找。如果最后仍未找到文件则 include 结构会发出一条警告;这一点和 require 不同,后者会发出一个致命错误。如果定义了路径——不管是绝对路径(在 Windows 下以盘符或者 \ 开头,在 Unix/Linux 下以 / 开头)还是当前目录的相对路径(以 . 或者 .. 开头)——include_path 都会被完全忽略。例如一个文件以 ../ 开头,则解析器会在当前目录的父目录下寻找该文件。

附2:参考文章 《深入理解PHP之require/include顺序》 from Laruence.

其实主要的问题是程序设计的问题:
dirA/a1.php, a2.php
其中a1.php包含了a2.php,代码如下:include 'a2.php';
dirB/b.php
b.php里面要包含dirA/a1.php
,然后a1.php被载入,然后他包含a2.php的代码就出错了。

所以这些框架就只能用绝对路径来了。

我见到的框架 一般是在index.php 定义一个 ROOT: 像这样子: define(ROOT, dirname(FILE));

在内部的话解析路径的话就只要加ROOT就好了,不会像你说的那样直接写绝对路径(你说:为什么PHP的主流框架和CMS都是用绝对路径而不是相对路径? )

另外一个问题, 相对路径也是要解析成绝对路径然后再去读取目录数据, 所以解析的路径都一样的。

最主要的原因是性能,绝对路径速度快。

影响性能的原因主要有两个:

include语句算法,虽然官网提到使用相对路径后,忽略include_path

被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 includepath 指定的目录寻找。如果在 includepath 下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找。如果最后仍未找到文件则 include 结构会发出一条警告;这一点和 require 不同,后者会发出一个致命错误。

如果定义了路径——不管是绝对路径(在 Windows 下以盘符或者 \ 开头,在 Unix/Linux 下以 / 开头)还是当前目录的相对路径(以 . 或者 .. 开头)——include_path 都会被完全忽略。例如一个文件以 ../ 开头,则解析器会在当前目录的父目录下寻找该文件。

php5.2之前我测试过还是会受include_path影响,最新版本不清楚。

apc等缓存绝对路径。如果使用相对路径,也要转成绝对路径做hash。使用绝对路径省了这层转换。

用绝对路径,可以减少花在解决OS路径的时间

相关标签: php cms 框架

上一篇:

下一篇: