<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 함수는 즉시 캐시를 업데이트하지 않습니다?일반적인 원인과 솔루션</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">## 하나、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 바이트 코드로 컴파일 된 파일,공존 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 적극적으로 감지하지 않습니다,导致은닉처하나直使用旧版本。
</span><span><span class="hljs-number">2</span></span><span>. **opcache_compile_file 기존 캐시를 덮어 쓰지 마십시오**
- 此函数~의设计初衷是“예열”은닉처,기존 컨텐츠를 교체하는 대신。
- 하나旦文件已은닉처,后续부르다 `</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>두 번째 매개 변수를 True 로 설정한다는 것은 다음에 캐시를 개간하기 위해 캐시를 지우는 힘을 의미합니다.
opcache_compile_file <br>와 함께 사용하십시오 일반적인 관행은 Opcache_InValidate () 에게 전화하여 먼저 이전 캐시를 지우고 Opcache_compile_file ()을 호출하여 새 캐시를 따뜻하게하는 것입니다.
파일 타임 스탬프 <br>에주의하십시오 Opcache가 변경 사항을 올바르게 감지 할 수 있도록 파일을 업데이트 할 때 MTIME 변경 (예 : Touch 명령을 통해)이 변경되어 있는지 확인하십시오.
통합 프로세스 상태 <br> 다중 프로세스 환경에서는 일부 프로세스가 이전 캐시를 읽지 않도록 응용 레이어 로직 (예 : 게시 시스템)을 사용하여 캐시 새로 고침 및 워밍업을 균일하게 수행 할 수 있습니다.
opcache_compile_file () 은 "Compert Cache"기능이 아니라 "Compile 및 Add"도구입니다. 파일이 캐시 된 경우 기존 컨텐츠를 적극적으로 대체하지 않습니다.
코드 업데이트가 즉시 발효 될 수 있도록 Opcache_InValidate ()를 사용하여 이전 캐시를 지우고 Opcache_Compile_File () 로 예열하는 것이 좋습니다. 이것은 잔류 오래된 캐시를 피할 수있을뿐만 아니라 발사 후 고성능을 보장 할 수 있습니다.
Opcache의 운영 메커니즘을 이해하고 기능을 사용함으로써 만 합리적으로 우리는 성능 최적화 및 코드 배포의 장점을 진정으로 제공 할 수 있습니다.
<span></span>