You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP 7.1中require/include加载文件结果未更新问题咨询

PHP 7.1下该代码的输出及原因

在PHP 7.1环境下运行这段代码,你会得到这样的输出:

Old value: 2000-01-01 00:00:00 New value: 2000-01-01 00:00:00

为什么和PHP 5.3的输出不一样?

核心原因是OPcache扩展的默认启用状态差异:

  • PHP 5.3时期,OPcache还不是官方内置的扩展,默认是关闭的,每次require都会重新读取并解析文件内容。
  • 从PHP 5.5开始,OPcache成为了官方内置扩展,并且默认开启。它的作用是缓存PHP脚本编译后的字节码,避免重复编译,以此提升性能。

当你第一次require 'file.php'时,OPcache会把这个文件的编译结果(也就是返回'2000-01-01 00:00:00'的字节码)缓存起来。之后你修改了file.php的内容,但OPcache默认会每2秒才检查一次文件是否被修改(由opcache.revalidate_freq配置项控制)。由于脚本运行速度极快,第二次require时还没到缓存重新验证的时间,所以直接复用了缓存里的旧结果,导致$newValue还是最初的时间。

如何让PHP 7.1输出和PHP 5.3一致?

如果需要在PHP 7.1中得到和旧版本一样的结果,有两种常见方法:

  • 临时清除单个文件的缓存:在每次require前调用opcache_invalidate()函数,强制让OPcache重新读取文件内容。
  • 修改OPcache配置:把opcache.revalidate_freq设为0(实时检查文件修改,但会牺牲部分性能,不建议在生产环境这么做)。

这里是修改后的示例代码:

<?php
// 先清除file.php的缓存,确保第一次读取的是最新内容
opcache_invalidate('file.php', true);

$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);

// 修改文件后再次清除缓存,确保第二次读取到新内容
opcache_invalidate('file.php', true);
$newValue = require 'file.php';

echo "Old value: $oldValue ";
echo "New value: $newValue ";
?>

运行这段修改后的代码,就能得到和PHP 5.3一样的输出了。


内容的提问来源于stack exchange,提问作者T. AKROUT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:31:56