2

かなり単純な質問ですが、実際にははっきりとは言えません。PHP は、APC によって既にキャッシュされているファイルの require/includes でどのように動作しますか? 私の理解では、このキャッシュは主に、既にキャッシュされているファイルをコンパイルする PHP を節約しますが、ファイルの検索/フェッチに必要なディスク ヒットも節約できるかどうかは明らかではありません。そうですか。それとも、オペコードが既にキャッシュされている場合でも、PHP はディスクにヒットしますか?唯一の違いは、コンパイル プロセスを再度実行しないことだけですか?

require/includes は、ファイルがキャッシュされていることを魔法のように認識し、APC のおかげでメモリから直接フェッチすると思いますが、これが事実であると想定する理由がないことに気付きました。

4

3 に答える 3

1

実際、APC*once バリアント (include_once、require_once) に対して OPEN システムコールを実行します。これは、strace を使用して簡単に確認できます。

これは、*once のコードが若干異なるためです (apc によって上書きされる) compile_filename を呼び出す前に zend_stream_open を呼び出します。

https://github.com/php/php-src/blob/master/Zend/zend_execute.h

バグトラッカーにも未解決の問題があります: https://bugs.php.net/bug.php?id=59372

于 2012-11-01T11:31:10.623 に答える
0

APCは、Zend Engineの関数zend_compile_fileをオーバーライドします。この関数は、特に実際のファイルを見つけて開く役割を果たします。このおかげで、ファイルがすでにキャッシュされている場合、ディスクヒットが発生する前に「ハイジャック」することができます。

したがって、はい、ファイルはキャッシュされている場合はメモリから提供されます。

ソース:APCTechnotesとZendEngineのソースコード、具体的にはzend_language_scanner.c

于 2012-07-03T03:58:52.770 に答える