php的相对路径和绝对路径

问题描述:

我读过,当包括一个php文件,使用绝对路径比相对路径处理时间更快。php的相对路径和绝对路径

你会建议使用什么?

include("includes/myscript.php"); 

include("/home/ftpuser/public_html/includes/myscript.php"); 

甚至

set_include_path("/home/ftpuser/public_html/includes"); 
include("myscript.php"); 

或者是它的东西,我真的不应该担心?

我通常设定的常数,通过手动或类似这样的:

define('ROOT', dirname(__FILE__)); 

然后做

require ROOT . '/include/file.php'; 
+0

如果你有'ROOT',为什么不'set_include_path(get_include_path()。PATH_SEPARATOR.ROOT)'? – chelmertz 2009-11-18 11:18:14

+6

因为那么你仍然在搜索包含路径 - 这种方式没有涉及搜索。 – Greg 2009-11-18 12:03:35

+0

如果你先放置它,这是一个非常简单/快速的搜索:'set_include_path(ROOT.PATH_SEPARATOR.get_include_path())'。另外,如果要包含大量文件(可在解答中详细阐述我的意见),可维护性可能会受到影响。) – chelmertz 2009-11-18 12:10:58

当不使用绝对路径时,php会尝试在所有包含路径中查找文件,直到找到匹配为止。

尽可能多的包含路径可以随意添加,因此在极少数情况下会导致脚本变慢。
如果你是包括许多文件(例如初始化框架)使用绝对路径可能会加快脚本有点...

我认为,当相同的相对路径/文件名消减发生多它也可能引起并发症时间,因此php选择第一次发生,当你可能需要另一次发生时

这将是很好的你测试所有的方法,通过检查每个执行所需的时间,个人我从来没有担心它并只使用相对路径。

我想绝对路径会稍微快一点,它可能值得想知道错误发生了什么,它会吐出你的完整文件路径到用户屏幕(显然关闭error_reporting),这会造成安全风险?

+1

就我所知,它以任何方式吐出完整的文件路径。这是确定你的意思是“index.php”的唯一方法。 – 2009-11-19 22:05:57

绝对不要硬编码你的路径,就像选项二一样。一个好的选择是:

define('BASE_DIR', '/home/ftpuser/public_html/includes'); 
include(BASE_DIR . '/myscript.php'); 
include(BASE_DIR . '/myscript2.php'); 
include(BASE_DIR . '/myscript3.php'); 
include(BASE_DIR . '/myscript4.php'); 

考虑到你可能不得不介于5和50包括(我猜),我不会真的担心。只要走相对路径。包含时间差别甚至不会显而易见。如果你正在开发一个大型的网络应用程序,将有数百个,这可能是另一个故事...

我倾向于通过设置我的应用程序的初始化包含路径设置我的包含目录/库。

set_include_path("/home/ftpuser/public_html/includes"); 
include("myscript.php"); 

zend框架的做法与加载库类类似。

这是99%的情况下的最佳方法:

include(dirname(__FILE__)."/includes/myscript.php"); 

这最终成为绝对路径,这意味着它将忽略include_path,这是一个已知的来源在我的经验中包括大量的相关的错误...

虽然表现明智,但我怀疑绝对和相对路径之间有很大的差异。这是一种微观优化,从长远来看没有任何意义。 include_path通常只有2-3件东西,除非您添加更多东西。两个通常的元凶是./以及安装到pear的任何位置的路径。

最重要的事情是安排包括道路,这样的require/include -calls量最大被困在第一次提到路径时不包括通过在首位的绝对路径的文件。

依赖于通过绝对路径包含所有内容很难维护,因为更改库的路径意味着单独更改引用它的所有文件,而不是在一个位置更改包含路径。

我用microtime(true)写了一个简单的速度测试脚本。它测试一百万次迭代以下五种包括方法:

// Absolute path. 
include('/home/ftpuser/public_html/includes/myscript.php'); 

// Predefined path. 
define('PATH', '/home/ftpuser/public_html/includes/'); 
include(PATH . 'myscript.php'); 

// Relative path. 
include('myscript.php'); 

// Using set_include_path(). 
set_include_path('/home/ftpuser/public_html/includes/'); 
include('myscript.php'); 

// Superglobal path. 
include(dirname(__FILE__) . '/myscript.php'); 


哪个结果如下(单位:秒):

 
    Absolute path:   263.222 
    Predefined path:   263.545 
    Relative path:   301.214 
    Using set_include_path(): 302.396 
    Superglobal path:   269.631 


我基于这些结果的意见是使用预定义的路径,因为它是绝对路径中最快的。但是,绝对路径的缺点是必须在每个文件中更改必要的更改。

希望这有助于。 :)

P.S.
defineset_include_path()在脚本执行过程中仅使用过一次(它们位于循环之外)。