我所读到的有关更好的PHP编码实践的所有内容都一直在说不要因为速度原因而使用require_once

为什么是这样?

做与require_once相同的事情的正确/更好的方法是什么?如果重要的话,我使用的是PHP 5。

最佳答案

require_onceinclude_once都要求系统保留已包含/需要的内容的日志。每个*_once调用都意味着检查该日志。因此,肯定有一些额外的工作要做,但足以损害整个应用程序的速度吗?

...我真的对此表示怀疑...除非您使用的是真正的旧硬件或经常使用它。

如果您正在执行数千个*_once,则可以以更轻松的方式自己完成工作。对于简单的应用程序,只需确保仅将其包含一次就足够了,但如果仍然遇到重新定义的错误,则可以执行以下操作:

if (!defined('MyIncludeName')) {
    require('MyIncludeName');
    define('MyIncludeName', 1);
}

我个人会坚持使用*_once语句,但是在愚蠢的百万次通过基准测试中,您可以看到两者之间的区别:
                php                  hhvm
if defined      0.18587779998779     0.046600103378296
require_once    1.2219581604004      3.2908599376678
require_once的速度慢10-100倍,奇怪的是require_oncehhvm似乎慢一些。同样,仅当您运行数千次*_once时,这才与您的代码相关。
<?php // test.php

$LIMIT = 1000000;

$start = microtime(true);

for ($i=0; $i<$LIMIT; $i++)
    if (!defined('include.php')) {
        require('include.php');
        define('include.php', 1);
    }

$mid = microtime(true);

for ($i=0; $i<$LIMIT; $i++)
    require_once('include.php');

$end = microtime(true);

printf("if defined\t%s\nrequire_once\t%s\n", $mid-$start, $end-$mid);
<?php // include.php

// do nothing.

10-08 08:21
查看更多