APCの動作 1 キャッシュの取得と生成
APCの動作について調べる必要があったので、調べた際のメモを公開。
今回はキャッシュの取得や格納部分について。元気があればキャッシュの削除等についても公開するかも。
設定によってどういった動作をするのかがメインなので、Opcode周辺には触れない。というかよくわからないので触れられない。
内容はAPC-3.0.14をLinuxで動かした場合を想定。
内容についてのツッコミ大歓迎。
初期化
- apc.num_files_hintはキャッシュされるファイル総数のヒント
- この値を2倍した数(num_slots)だけslot(1件のキャッシュをあらわすデータ)の領域が確保される
- ただし、この数がキャッシュ数の上限ではない
キャッシュの取得と生成の動作
- zend_compile_file関数を上書きしたmy_compile_file関数が呼ばれる
- apc_cache_make_file_key キャッシュ検索用にapc_cache_keyを作る関数
- stat=on
- stat=off
- apc_cache_find -> apc_cache_find_slot
- apc_cache_insert
メモ
- stat=onの場合はデバイスIDとinode番号でキャッシュを識別するため、例えばファイル名を変更してもinode番号が変わらなければ同じキャッシュを使い続ける事になる
- max_file_sizeはstat=offの場合無視されるっぽい
- PHPでrequireとかに渡すパスは絶対パスじゃないと相当遅くなる
- stat=offの場合はincludeパスを調べてくれないの?
- stat=onの場合ハッシュの計算方法は(デバイスID+inode番号)%num_slots
- TECHNOTES.txtによればrealpathを呼ぶと遅くなるのでinodeを使っていると書いてあるけど、なんでデバイスIDと足しているのか不明
- apc.num_files_hintが少なすぎる場合は微妙に遅くなる
- ttlに達したからといってそのキャッシュが使われなくなるわけではない