<p><span style="text-wrap-mode: nowrap;">根据环境选择策略:</span></p><p><span style="text-wrap-mode: nowrap;"><br></span></p><p><span style="text-wrap-mode: nowrap;">### 方案 A:开发环境(零延迟)</span></p><p><span style="text-wrap-mode: nowrap;"><br></span></p><p><span style="text-wrap-mode: nowrap;">```ini</span></p><p><span style="text-wrap-mode: nowrap;">; php.ini 或 .user.ini</span></p><p><span style="text-wrap-mode: nowrap;">opcache.enable=1</span></p><p><span style="text-wrap-mode: nowrap;">opcache.validate_timestamps=1</span></p><p><span style="text-wrap-mode: nowrap;">opcache.revalidate_freq=0 ; 每次请求都检查,牺牲性能换实时性</span></p><p><span style="text-wrap-mode: nowrap;">```</span></p><p><span style="text-wrap-mode: nowrap;"><br></span></p><p><span style="text-wrap-mode: nowrap;">### 方案 B:生产环境(平衡策略)</span></p><p><span style="text-wrap-mode: nowrap;"><br></span></p><p><span style="text-wrap-mode: nowrap;">保持 `revalidate_freq=60` 以获取性能,但在**部署脚本**中主动刷新:</span></p><p><span style="text-wrap-mode: nowrap;"><br></span></p><p><span style="text-wrap-mode: nowrap;">```bash</span></p><p><span style="text-wrap-mode: nowrap;"># 部署后执行</span></p><p><span style="text-wrap-mode: nowrap;">php -r "opcache_reset();"</span></p><p><span style="text-wrap-mode: nowrap;"># 或优雅地仅失效特定文件</span></p><p><span style="text-wrap-mode: nowrap;">php -r "opcache_invalidate('/path/to/config.php', true);"</span></p><p><span style="text-wrap-mode: nowrap;">```</span></p><p><span style="text-wrap-mode: nowrap;"><br></span></p><p><span style="text-wrap-mode: nowrap;">### 方案 C:安装程序(代码层强制刷新)</span></p><p><span style="text-wrap-mode: nowrap;"><br></span></p><p><span style="text-wrap-mode: nowrap;">最优雅的做法:不修改服务器配置,在安装代码中处理:</span></p><p><span style="text-wrap-mode: nowrap;"><br></span></p><p><span style="text-wrap-mode: nowrap;">```php</span></p><p><span style="text-wrap-mode: nowrap;">/**</span></p><p><span style="text-wrap-mode: nowrap;"> * 安全写入配置并强制 OPcache 失效</span></p><p><span style="text-wrap-mode: nowrap;"> */</span></p><p><span style="text-wrap-mode: nowrap;">function install_write_config(string $file, array $config): bool</span></p><p><span style="text-wrap-mode: nowrap;">{</span></p><p><span style="text-wrap-mode: nowrap;"> $content = "<?php\nreturn " . var_export($config, true) . ";\n";</span></p><p><span style="text-wrap-mode: nowrap;"> </span></p><p><span style="text-wrap-mode: nowrap;"> // 原子写入</span></p><p><span style="text-wrap-mode: nowrap;"> $result = file_put_contents($file, $content, LOCK_EX);</span></p><p><span style="text-wrap-mode: nowrap;"> </span></p><p><span style="text-wrap-mode: nowrap;"> if (!$result) return false;</span></p><p><span style="text-wrap-mode: nowrap;"> </span></p><p><span style="text-wrap-mode: nowrap;"> // 关键:立即让 OPcache 失效该文件</span></p><p><span style="text-wrap-mode: nowrap;"> if (function_exists('opcache_invalidate')) {</span></p><p><span style="text-wrap-mode: nowrap;"> @opcache_invalidate($file, true); // true 表示强制刷新</span></p><p><span style="text-wrap-mode: nowrap;"> }</span></p><p><span style="text-wrap-mode: nowrap;"> </span></p><p><span style="text-wrap-mode: nowrap;"> // ThinkPHP 8 附加:清除运行时配置缓存</span></p><p><span style="text-wrap-mode: nowrap;"> $runtimeConfig = root_path() . 'runtime/config.php';</span></p><p><span style="text-wrap-mode: nowrap;"> if (file_exists($runtimeConfig)) {</span></p><p><span style="text-wrap-mode: nowrap;"> unlink($runtimeConfig);</span></p><p><span style="text-wrap-mode: nowrap;"> }</span></p><p><span style="text-wrap-mode: nowrap;"> </span></p><p><span style="text-wrap-mode: nowrap;"> return true;</span></p><p><span style="text-wrap-mode: nowrap;">}</span></p><p><span style="text-wrap-mode: nowrap;">```</span></p><p><br></p>
相关文章