【问题标题】:php relative and absolute pathsphp相对路径和绝对路径
【发布时间】:2010-12-17 20:00:09
【问题描述】:

我已经读到,当包含一个使用绝对路径的 php 文件时,处理时间比相对路径要快。

您建议使用什么?

include("includes/myscript.php");

或

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

甚至

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

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

【问题讨论】:

    标签: php include-path


    【解决方案1】:

    我使用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


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

    希望这会有所帮助。 :)

    P.S.
    define 和 set_include_path() 在脚本执行期间仅使用一次(它们位于循环之外)。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          【解决方案4】:

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

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

          那就做吧

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

          【讨论】:

          • 如果你有ROOT,为什么没有set_include_path(get_include_path().PATH_SEPARATOR.ROOT)?
          • 因为那时您仍在搜索包含路径 - 这样就不涉及搜索。
          • 如果你把它放在第一位,这是一个非常简单/快速的搜索:set_include_path(ROOT.PATH_SEPARATOR.get_include_path())。此外,如果要包含大量文件,可维护性可能会受到影响(在答案中详细阐述了我的观点。)
          • 还要看自动加载(仅适用于加载类)。使用 Zend 等大型库,自动加载使代码速度更快。
          【解决方案5】:

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

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

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

              • 据我所知,它会以任何一种方式吐出完整的文件路径。只有这样才能确定您指的是哪个index.php。
              【解决方案8】:

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

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2010-09-15
                • 2013-11-30
                • 2013-07-14
                • 1970-01-01
                • 2011-06-30
                • 1970-01-01
                • 2012-01-11
                • 2013-04-17
                相关资源
                最近更新 更多