<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// このドキュメントで使用します PHP コードスニペットラッピング,デモンストレーションのフォーマットのみ</span></span><span>
</span><span><span class="hljs-comment">// 実際のコンテンツは記事の主なテキストです,非実行コード。</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
---
</span><span><span class="hljs-comment"># なぜ opcache_compile_file 関数はすぐにキャッシュを更新しません?1つ般のな原因と解決策</span></span><span>
使用中 PHP の **Opcache** 拡大するとき,開発者はしばしば問題に遭遇します:電話 `</span><span><span class="hljs-title function_ invoke__">opcache_compile_file</span></span><span>()` 関数の後,预期の脚本更新并没有立即生效。言い換えると,キャッシュのようです“頑固”古いバージョンは保存されています。これは、デバッグエクスペリエンスに影響するだけではありません,また、オンラインホットアップデートに失敗する可能性があります。下,我们来分析其中の常见原因,并提供相应の解决方案。
</span><span><span class="hljs-comment">## 1つ、opcache_compile_file の作用机制</span></span><span>
`</span><span><span class="hljs-title function_ invoke__">opcache_compile_file</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)` の主要功能是将指定の PHP bytecodeにコンパイルされたファイル,共存します Opcache キャッシュで。既存のキャッシュを削除することはありません,代わりに、キャッシュが存在しない場合にのみコンパイルする傾向があります。。つまり、,もし该文件のキャッシュ已存在,電話该函数可能不会触发更新。
</span><span><span class="hljs-comment">## 二、不会立即更新キャッシュの常见原因</span></span><span>
</span><span><span class="hljs-number">1</span></span><span>. **有効期限が切れていないキャッシュがあります**
- Opcache ファイルはデフォルトでキャッシュされます,有効期限に達するか、ファイルが検出されて変更されるまで。
- もし `validate_timestamps=</span><span><span class="hljs-number">0</span></span><span>`,その後、ファイルコンテンツが更新されていても,Opcache 積極的に検出されません,导致キャッシュ1つ直使用旧版本。
</span><span><span class="hljs-number">2</span></span><span>. **opcache_compile_file 既存のキャッシュを上書きしないでください**
- 此函数の设计初衷是“予熱します”キャッシュ,既存のコンテンツを置き換える代わりに。
- 1つ旦文件已キャッシュ,后续電話 `</span><span><span class="hljs-title function_ invoke__">opcache_compile_file</span></span><span>()` 強制的に再コンパイルされません。
</span><span><span class="hljs-number">3</span></span><span>. **ファイルの変更時間は変更されていません**
- いつ `validate_timestamps=</span><span><span class="hljs-number">1</span></span><span>` そして `revalidate_freq > </span><span><span class="hljs-number">0</span></span><span>` 時間,Opcache 会根据文件の修改時間间 (mtime) 再コンパイルが必要かどうかを判断するため。
- もし文件の mtime 更新なし(例如直接覆盖文件内容但未改变時間间戳),则不会触发キャッシュ刷新。
</span><span><span class="hljs-number">4</span></span><span>. **opcache.restrict_api 制限**
- 一部のサーバー環境で,`</span><span><span class="hljs-title function_ invoke__">opcache_compile_file</span></span><span>()` の電話可能被制限,导致函数電話并没有生效。
</span><span><span class="hljs-number">5</span></span><span>. **多进程环境の延迟**
- PHP-FPM または Apache マルチプロセスモードで,不同进程间の Opcache 州に同期遅延があるかもしれません。
- 場合によっては,即使某个进程已更新キャッシュ,他のプロセスでは、古いバージョンを使用する場合があります。
</span><span><span class="hljs-comment">## 三つ、解決策と提案</span></span><span>
</span><span><span class="hljs-number">1</span></span><span>. **启用時間间戳验证**
```ini
opcache.validate_timestamps=</span><span><span class="hljs-number">1</span></span><span>
opcache.revalidate_freq=</span><span><span class="hljs-number">0</span></span><span>
</span></span>これにより、ファイルが変更されるとすぐにキャッシュが更新されます。
手動でクリーンなキャッシュ<br> コードを更新した後、次の機能を呼び出すことができます。
<span><span><span class="hljs-title function_ invoke__">opcache_invalidate</span></span><span>(</span><span><span class="hljs-string">'/path/to/file.php'</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
</span></span>2番目のパラメーターを真のパラメーターに設定することは、次回の再コンパイルを確実にするためにキャッシュを強制的にクリアすることを意味します。
opcache_compile_file <br>と組み合わせて使用します 一般的な慣行は、最初にOpcache_Invalidate()を呼び出して古いキャッシュをクリアし、次にopcache_compile_file()を呼び出して新しいキャッシュをウォームアップすることです。
ファイルタイムスタンプに注意してください<br> ファイルを更新するときに、MTIMEが変更されたときにMTIMEが変更されていることを確認してください。
統一されたプロセスステータス<br> マルチプロセス環境では、アプリケーションレイヤーロジック(公開システムなど)の助けを借りて、キャッシュの更新とウォームアップを均一に実行して、古いキャッシュの読み取りを防ぐことができます。
opcache_compile_file()は「更新キャッシュ」機能ではなく、「キャッシュをコンパイルして追加」ツールです。ファイルがキャッシュされている場合、既存のコンテンツを積極的に置き換えません。
コードの更新がすぐに有効になることを確認するには、 opcache_invalidate()を使用して古いキャッシュをクリアし、 opcache_compile_file()で予熱することをお勧めします。これは、残留古いキャッシュを回避するだけでなく、起動後に高性能を確保することもできます。
Opcacheの動作メカニズムを理解し、機能を合理的に使用することによってのみ、パフォーマンスの最適化とコード展開におけるその利点を完全にプレイすることができます。
<span></span>