php相对路径和绝对路径

php相对路径和绝对路径,php,include-path,Php,Include Path,我读过,当包含一个php文件时,使用绝对路径比相对路径的处理时间更快 你建议用什么 include("includes/myscript.php"); 或 甚至 set_include_path("/home/ftpuser/public_html/includes"); include("myscript.php"); 或者这是我真的不应该担心的吗?当不使用绝对路径时,php会尝试在所有包含路径中查找文件,直到找到匹配项为止 可以添加任意多个包含路径,因此在极少数情况下,这可能会导致脚本速

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

你建议用什么

include("includes/myscript.php");

甚至

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

或者这是我真的不应该担心的吗?

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

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


我认为当相同的相对路径/文件名pare在文件系统上多次出现时,也可能会导致复杂性,因此php会选择第一次出现,当您可能需要另一次出现时,最好通过检查每个方法的执行时间来测试所有方法,就我个人而言,我从来没有担心过它,只是使用了相对路径


我想绝对路径会稍微快一点,可能值得考虑的是错误会发生什么,它会将您的完整文件路径显示到用户屏幕(显然会关闭错误报告),这会导致安全风险吗?

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

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应用程序,并且将有数百个,那可能是另一回事……

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

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

zend框架执行类似于加载库类的操作。

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

define('ROOT', dirname(__FILE__));
那就做吧

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

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

include(dirname(__FILE__)."/includes/myscript.php");
这最终是一个绝对路径,这意味着它将忽略
include\u path
,这是我经验中大量与include相关的bug的已知来源


不过,就性能而言,我怀疑绝对路径和相对路径之间是否存在很大差异。这是一种微观优化,从长远来看毫无意义。除非添加更多内容,否则
include\u path
中通常只有2-3个内容。两个常见的罪魁祸首是
/
和安装
pear
的地方的路径。

最重要的是安排包含路径,以便在不通过绝对路径包含文件时,最大数量的
require
/
include
-调用被困在第一个提到的路径中第一位


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

我使用
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
基于这些结果,我的观点是使用预定义的路径,因为它是最快的,只有绝对路径才能超过它。但是,绝对路径有一个缺点,即当需要更改时,必须在每个文件中更改绝对路径

希望这有帮助。:)

附加说明

define
set\u include\u path()
在脚本执行期间只使用了一次(它们位于循环之外)。

如果您有
ROOT
,为什么不
set\u include\u path(get\u include\u path().path\u SEPARATOR.ROOT)
?因为此时您仍在搜索包含路径-这样就不需要搜索。如果您将其放在第一位,这是一个非常简单/快速的搜索:
设置包含路径(ROOT.path\u SEPARATOR.get\u include\u path())
。此外,如果要包含大量文件(在回答中详细阐述了我的观点),那么可维护性可能会受到影响。另外,请查看自动加载(仅适用于加载类)。对于像Zend这样的大型库,自动加载会使代码更快。据我所知,它会以任何一种方式输出完整的文件路径。这是确定您指的是哪个
index.php
的唯一方法。
// 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