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");

还是我真的不应该担心的事情?

4

8 回答 8

16

我通常手动设置一个常量,或者像这样设置:

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

然后做

require ROOT . '/include/file.php';
于 2009-11-18T11:02:37.077 回答
8

对于 99% 的情况,这是最好的方法:

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

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

不过,在性能方面,我怀疑绝对路径和相对路径之间存在很大差异。这是一种微观优化,从长远来看没有任何意义。除非您添加更多内容,否则通常只有 2-3 个内容include_path。两个常见的罪魁祸首是安装./路径pear

于 2009-11-18T11:02:42.620 回答
8

我使用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');


这给出了以下结果(以秒为单位):

    绝对路径:263.222
    预定义路径:263.545
    相对路径:301.214
    使用 set_include_path(): 302.396
    超全局路径:269.631


My opinion based on these results is to use a predefined path, because it's the fastest only surpassed by an absolute path. However, an absolute path has the drawback that it must be altered in every file when a change is necessary.

Hope this helped. :)

P.S.
define and set_include_path() were used only once during execution of the script (they are located outside of the loop).

于 2013-02-12T20:13:58.200 回答
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 应用程序并且将有数百个,那可能是另一回事了......

于 2009-11-18T11:02:23.837 回答
2

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

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

Zend 框架做了类似的事情来加载库类。

于 2009-11-18T11:02:28.640 回答
1

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

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

我认为当相同的相对路径/文件名在文件系统上多次出现时,它也可能导致并发症,因此 php 选择第一次出现,而您可能需要再次出现

于 2009-11-18T11:00:51.840 回答
1

最重要的是安排包含路径,以便requireinclude在首先不通过绝对路径包含文件时将最大数量的/调用捕获在第一个提到的路径中。

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

于 2009-11-18T11:23:57.783 回答
0

通过检查执行每个方法所需的时间来测试所有方法对您有好处,我个人从不担心它,只是使用了相对路径。

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

于 2009-11-18T11:01:01.997 回答