PHP相对路径和绝对路径

14

我已经阅读过了,包含一个使用绝对路径的PHP文件比使用相对路径具有更快的处理速度。

你建议使用什么?

include("includes/myscript.php");
或者。
include("/home/ftpuser/public_html/includes/myscript.php");
甚至更多
set_include_path("/home/ftpuser/public_html/includes");
include("myscript.php");

还是说这不是我需要担心的事情?

8个回答

16

我通常会设置一个常量,要么手动设置,要么像这样:

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

那么就这样做

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

如果您有ROOT,为什么不使用set_include_path(get_include_path().PATH_SEPARATOR.ROOT)呢? - chelmertz
6
因为这样你仍然需要搜索包含路径——而使用这种方法就不需要搜索。 - Greg
如果你把它放在第一位,这是一个相当简单/快速的搜索:set_include_path(ROOT.PATH_SEPARATOR.get_include_path())。此外,如果要包含大量文件,则可维护性可能会受到影响(我在答案中详细阐述了我的观点)。 - chelmertz
还要看自动加载(仅适用于加载类)。对于像Zend这样的大型库,自动加载使代码运行更快。 - andho

8

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

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

这最终会成为一个绝对路径,这意味着它将忽略include_path,在我的经验中,这是许多包含相关错误的已知来源...
就性能而言,我怀疑绝对路径和相对路径之间没有太大区别。这是一种微观优化,在长期运行中毫无意义。通常只有2-3个东西在include_path中,除非您添加更多内容。两个常见的罪魁祸首是./pear安装路径。

8

我编写了一个使用microtime(true)的简单速度测试脚本。 它对以下5种方法进行了100万次迭代的测试:

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

以下是结果(以秒为单位):
    绝对路径:263.222
    预定义路径:263.545
    相对路径:301.214
    使用 set_include_path():302.396
    超全局路径:269.631
根据这些结果,我的观点是使用预定义路径,因为它是最快的,仅次于绝对路径。但是,绝对路径的缺点是在每个文件中都必须进行更改。
希望这有所帮助。 :)
P.S. define 和 set_include_path() 仅在执行脚本期间使用了一次(它们位于循环之外)。

3

绝对不要像第二种选项一样硬编码您的路径。一个好的替代方法是:

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个包含文件(我猜测),所以不用太担心。只需使用相对路径即可。包含时间差异甚至不会被注意到。如果你正在开发一个大型Web应用程序,并且将有数百个包含文件,那可能就是另外一回事了...


2

我通常通过在应用程序初始化时设置包含路径来设置我的包含目录/库。

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

Zend框架采用类似的方式来加载库类。

1

当没有使用绝对路径时,PHP会在所有包含路径中查找文件,直到找到匹配项为止。

可以添加任意多个包含路径,但在极少数情况下,这可能会导致脚本变慢。
如果您要包含许多文件(例如初始化框架),使用绝对路径可以稍微加快脚本的速度...

我认为当相同的相对路径/文件名出现多次在文件系统上时,这也可能会引起复杂性,因此PHP选择第一个出现的位置,而您可能需要另一个位置。


1
最重要的是要安排包含路径,以便在首次提及时捕获最大数量的require/include调用,而不是通过绝对路径包含文件。
依赖于通过绝对路径包含所有内容很难维护,因为更改库的路径意味着需要单独更改所有引用它的文件,而不是在一个地方更改包含路径。

0

通过检查每个方法执行所需的时间来测试所有方法可能是有益的,但就我个人而言,我从未担心过这个问题,只使用相对路径。

我猜绝对路径会稍微快一些,但值得思考的是,在出现错误时会发生什么情况,它是否会将您的完整文件路径输出到用户屏幕上(显然要关闭错误报告),并且这会导致安全风险吗?


1
据我所知,它会完整地输出文件路径。这是确保你指的是哪个 index.php 的唯一方法。 - Matthew Scharley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接