【问题标题】:php processing of include files包含文件的php处理
【发布时间】:2012-07-26 14:02:14
【问题描述】:

这个问题与 PHP 引擎的内部机制有关。我问它是为了理解文件包含过程。

假设您有一个包含在所有 php 脚本中的 20,000 行包含文件(类似于“functions_library.php”)。

每次您的一个 php 脚本加载该文件时,PHP 是否会检查/验证该包含文件的语法是否正确?这个过程是否在每次页面加载时一遍又一遍地发生?

或者……

PHP 会注意文件的最后修改日期吗?如果事实证明自上次检查以来没有对其进行任何更改,它是否只是忽略检查?

【问题讨论】:

  • +1 好问题。也想知道这个。

标签: php performance include internals


【解决方案1】:

在默认安装中,每次都会解析该文件。但是,建议任何 PHP 的生产安装都具有字节码缓存,例如 APCmany others。使用字节码缓存时,第一次解析脚本,将解释后的代码存储在内存中。

不同的配置可能会改变检查文件修改的频率。在某些配置下,为了获得非常高的性能,可能需要手动刷新或重新启动 Web 服务器。

【讨论】:

  • 10000 个网络用户在同一 1 秒内访问同一个 php 文件(例如主页)怎么样?服务器是否仍然为每个用​​户处理该死的 20000 行包含文件 10000 次,还是对此有更好的处理?
  • 首先,20,000 行代码不算什么。如果你没有启用字节码缓存,它会做很多不必要的返工。至于同一秒内10000个用户,那已经很多了,你的单台服务器就会死掉。
  • 好吧,路易斯,那不是我的意思。 10000 个用户肯定会导致一台服务器宕机。我应该选择一个更现实的数字,20 怎么样。PHP 会在那一秒内为每个用户解释这个文件 20 次,还是从服务器缓存中提供解释代码?我对字节码缓存不熟悉。
  • 字节码缓存是代码的编译版本。所以不需要任何验证或解析。代码仍然需要为每个请求运行,这是实际的解释。您可以编写代码来缓存一些较慢的部分,或者使用像 Varnish 这样的缓存服务器并设置适当的标头。然而,这是一个非常广泛的话题。
【解决方案2】:

如果包含该文件,PHP 每次都需要解释它。

【讨论】:

  • 这是有道理的,因为这里的关键词是“解释”而不是“编译”。
【解决方案3】:

每次调用include()时,PHP 都会重新解释文件。

这可以通过使用变量进行直观测试。如果你有这样的事情:

otherScript.php:
   <?php echo $foo; ?>

script.php:
    <?php
    $foo = 1;
    include("otherScript.php");
    $foo = 2;
    include("otherScript.php");
    ?>

输出将是:

12

这是一个糟糕的例子,但它应该证明 PHP 每次都需要包含文件的内容。说明 PHP 解释器不会为每个引用在内存中保留包含文件的副本是一个很好的猜测 - 每个应用程序可能有数百个包含。

然而,为了处理这个特定的理想,他们提供了一种方法include_once(),顾名思义,该方法只包含一次文件,并防止它被包含任何其他时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2012-05-24
    • 2018-04-28
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多