这个问题是关于PHP解析引擎的。
当我在一个运行时多次包含一个文件时,PHP每次都会对它进行标记,还是保留一个缓存并在后续的包含中运行已编译的代码?
编辑:更多详细信息:我没有使用外部缓存机制,我正在处理同一个请求期间多次包含的相同的文件< / em>的
编辑2:我想要包含的文件包含过程代码。我希望每次include()
时都执行它,我只是好奇,如果PHP出于速度原因内部跟踪文件的标记化版本。
答案 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()。希望有所帮助!