是PHP缓冲的命令



我的脚本中有一些问题,因为与 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));

最新更新