我的脚本中有一些问题,因为与 include
我可以将其简化为小型代码示例:
<?php
$res = 0;
include "test.txt";
echo "RES = > $res".PHP_EOL;
file_put_contents('./test.txt','<?php $res='.($res+1).';'.PHP_EOL);
include "test.txt";
echo "RES = > $res".PHP_EOL;
我期望输出
RES => 0
RES => 1
//On next Call I'm expecting ...
RES => 1
RES => 2
但是我得到了什么:
RES => 0
RES => 0
即使下一个呼叫给出相同的结果(RES => 0)。当我以后回想起脚本1-2秒时,我会得到Res的增量。
所以我的问题是:包括PHP缓冲的陈述吗?我没有在PHP文档中看到有关缓冲的某些部分。我的示例有什么问题?
这取决于您是否安装了OPCODE缓存。如果执行脚本,则第一次从内存中加载脚本。
我不确定没有OpCode缓存的行为。每次调用include
时,PHP可能会从磁盘加载文件。您可以与Strace等人一起发现。即使PHP在随后的include
的调用中返回磁盘。
通常我会鼓励使用opcode缓存。
编辑
我现在看到您在第二个include
之前更改文件的内容...我已经尝试了CLI的示例,并且可以按照您的期望工作。通过CLI在服务器上尝试一下。如果它有效(应该是这样),那么您很有可能会启用OpCode缓存,并且特定配置正在阻止预期的行为。
您还应该验证Apache正在按照您的预期编写更新的文件。也许当您使用file_put_contents
写入磁盘时,您也会 log 生成的文件的每个版本是什么。现有file_put_contents
呼叫之后,类似的东西:
// For logging
file_put_contents('./test-' . time() . '.txt','<?php $res='.($res+1).';'.PHP_EOL);
从命令行或禁用opcache运行示例时,脚本正常工作。
禁用OPCACHE可以给出正确的结果。具有启用OPCACHE的解决方法将是这样的(这将阻止缓存文件):
//Instead of include "test.txt";
//we include the part manual by eval
$cont = file_get_contents("test.txt");
//Strip of leading <?php and eval the string
eval(substr($cont, 5));