为什么Required_One使用起来如此糟糕?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我所阅读的关于更好的PHP编码实践的一切都会说require_once因为速度而不使用。

为什么是这样?

做同样的事情的正确/更好的方式是什么require_once?如果它很重要,我使用PHP5。

提问于
用户回答回答于

require_once并且include_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

10-100倍慢,require_once而且好奇,require_once看起来好慢hhvm。同样,如果您运行*_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.
用户回答回答于

以下是应该考虑的问题:作为一般规则,包含在PHP中的代价很高,因为每次解释器遇到一个时,都必须切换回解析模式,生成操作码并跳回。如果你有100 +包括,这肯定会有性能影响。为什么使用或不使用require_once是一个非常重要的问题,因为它使操作码缓存变得很困难。这可以归结为:

  • 如果在解析时间内,您确切知道在请求的整个生命周期中需要包含哪些文件,require()那么开始时的操作码和操作码缓存将处理其他所有内容。
  • 如果您没有运行操作码缓存,那么您处于困难的境地。将所有包含内容的内容合并到一个文件中(不要在开发过程中这样做,只在生产中)可以帮助解析时间,但这是一件很痛苦的事情,而且,您需要确切知道在请求。
  • 自动加载非常方便,但速度很慢,因为每次加载完成后都必须运行自动加载逻辑。实际上,我发现为一个请求自动加载多个专用文件不会导致太多问题,但是您不应该自动加载所有您需要的文件。
  • 如果有可能10包括(这是一个非常回信封计算),这一切手淫是不值得的:只是优化您的数据库查询或东西。

扫码关注云+社区