PHP处理包含文件

7
这个问题涉及到PHP引擎的内部机制。我问这个问题是为了理解文件包含过程。假设你有一个20,000行的文件包含文件(例如“functions_library.php”),它被包含在所有php脚本中。
PHP是否会在每次加载该文件时检查/验证该包含文件是否语法正确?这个过程会一遍又一遍地在每个页面加载时发生吗?
或者,PHP是否注意文件的最后修改日期?如果最后一次检查以来没有对其进行更改,它是否会忽略检查?

1
+1 好问题。我也想知道这个。 - Ignas
3个回答

4
在默认安装情况下,该文件将被每次解析。但是,建议生产安装PHP具有字节码缓存,如APC其他的。使用字节码缓存后,脚本仅在第一次解析时才会解析,并且解释代码将存储在内存中。
不同的配置可能会改变文件修改检查的频率。在某些配置下,为了实现高性能,可能需要手动清除缓存或重新启动Web服务器。

如果有10000个Web用户在同一秒钟内访问同一个PHP文件(例如主页),那么服务器会处理该死的20000行包含文件10000次以供每个用户使用,还是有更好的处理方式? - Average Joe
首先,2万行代码算不了什么。如果你没有启用字节码缓存,它会做很多不必要的重复工作。至于在同一秒内有1万个用户,那是非常多的,你的单个服务器将会崩溃。 - Louis-Philippe Huberdeau
好的,路易斯,那不是我的重点。10000个用户肯定会使单个服务器崩溃。我应该选择一个更现实的数字,比如20。PHP是否会在每个用户的那一秒钟内解释这个文件20次,还是从服务器缓存中提供解释后的代码?我不熟悉字节码缓存。 - Average Joe
1
字节码缓存是代码的编译版本。因此,不需要进行任何验证或解析。代码仍然需要在每个请求中运行,这是实际的解释过程。您可以编写代码以缓存某些较慢的部分,或者使用像Varnish这样的缓存服务器并设置适当的标头。但是这是一个非常广泛的主题。 - Louis-Philippe Huberdeau

1
如果您包含了那个文件,PHP 将需要每次都进行解释。

这有些意义,因为这里的关键词是“解释”而不是“编译”。 - Dan Puzey

0

每次调用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(),正如其名称所示,它只会包含一次文件并防止它被包含多次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接