我有一个包含以下内容的文件:
<?php
return '2000-01-01 00:00:00';
?>
我有这段代码:
<?php
$oldValue = require 'file.php';
$now = new DateTime();
$handle = fopen('file.php', "w");
fputs($handle, "<?php\nreturn '" . $now->format('Y-m-d H:i:s') . "';");
fclose($handle);
$newValue = require 'file.php';
echo "Old value: $oldValue ";
echo "New value: $newValue ";
?>
PHP 5.3的输出是:
Old value: 2000-01-01 00:00:00 New value: 2018-03-28 10:33:12
PHP 7.1的输出是:
Old value: 2000-01-01 00:00:00 New value: 2000-01-01 00:00:00
在这两种情况下,文件中的字符串会发生变化。
有人可以帮我用PHP 7.1更新新值吗?
注意:这不是真正的问题。它只是一个问题的抽象,使事情变得更简单和易于理解。所以,请没有PHP best practices的教训。我只想对我的问题做出很好的回应。
谢谢:)
答案 0 :(得分:4)
作为commented by iainn问题是,PHP服务器在加载文件后缓存文件,而不是在第二次要求时从光盘重新调用文件,而是从它的内存缓存中调用它。
正如你所说:
&#34;文件内容发生变化&#34;
然后问题是 new 内容没有传递给脚本,而是使用旧内容的内存。
因此请调用clearstatcache()
强制清除缓存的文件数据。这应该在写入新数据以更新文件之后,以及在第二次调用文件之前放置。
如果这不起作用,那么文件数据可能会缓存在其路径的其他位置。
<?php
$oldValue = require 'file.php';
$now = new DateTime();
$handle = fopen('file.php', "w");
fputs($handle, "<?php\nreturn '" . $now->format('Y-m-d H:i:s') . "';");
fclose($handle);
clearstatcache(); // THIS line should help you
$newValue = require 'file.php';
echo "Old value: $oldValue ";
echo "New value: $newValue ";
?>
opcache_invalidate()
可能是一个更具体/更不通用的解决方案。答案 1 :(得分:-1)
你的文件被缓存(OPcache)和php在两个需要的调用中返回相同的文件可能是一个问题
您可以尝试修改opcache settings
opcache.enable = 0
然后进行测试?还有
opcache_reset()
可以帮到你,但如果你从CLI运行你的代码,它可能无法正常工作。