每次包含它时都会对同一文件进行标记吗?

时间:2009-04-30 00:22:26

标签: php parsing

这个问题是关于PHP解析引擎的。

当我在一个运行时多次包含一个文件时,PHP每次都会对它进行标记,还是保留一个缓存并在后续的包含中运行已编译的代码?

编辑:更多详细信息:我没有使用外部缓存机制,我正在处理同一个请求期间多次包含的相同的文件< / em>的

编辑2:我想要包含的文件包含过程代码。我希望每次include()时都执行它,我只是好奇,如果PHP出于速度原因内部跟踪文件的标记化版本。

4 个答案:

答案 0 :(得分:2)

您应该使用PHP字节码缓存,例如APC。这将实现您想要的,在后续请求中重用PHP页面的编译版本。否则,PHP会读取文件,进行标记并在每次请求时对其进行编译。

答案 1 :(得分:1)

看看include_once()。 它将再次包含它。

此外,如果您正在使用对象。看__autoload()

答案 2 :(得分:1)

默认情况下,每次(实际)包含文件时,即使在同一个php实例中也会解析文件。 但是有操作码缓存,例如apc

<?php
$i = 'include_test.php';
file_put_contents($i, '<?php $x = 1;'); include $i; echo $x, ' ';
file_put_contents($i, '<?php $x = 2;'); include $i; echo $x, ' '
1 2
(好的,弱证明.PHP可以检查文件的mtime是否已经改变。我认为apc的作用是什么。但是没有缓存PHP真的没有'吨)

答案 3 :(得分:0)

我刚刚写了一个基本测试,就像VolkerK一样。这是我测试的内容:

<?php
file_put_contents('include.php','<?php echo $i . "<br />"; ?>');

for($i = 0; $i<10; $i++){
    include('include.php');
    if($i == 5){
        file_put_contents('include.php','<?php echo $i+$i; echo "<br />"; ?>');
    }
}

?>

这产生了以下结果:

0
1
2
3
4
5
12
14
16
18

因此,除非它基于文件的mtime进行缓存,否则它似乎会解析每个包含。您可能希望使用include_once()而不是标准include()。希望有所帮助!