2007-09-25 APCの動作 2 キャッシュの削除 PHP 前回からの続きどんどん内容が怪しくなってきているので、引き続きツッコミは歓迎しておりまする。 削除 apc_cache_expunge キャッシュの片付けを行う関数 メモリの確保に失敗すると呼ばれる 呼ばれるとapc.phpでの「Cache full count」がひとつ増える ttlが定義されていない(0) キャッシュを全てremove_slotで削除する ttlが定義されている アクセス時刻からttl経過していたらremove_slotで削除する 削除するキャッシュはシーケンシャルに探す 多分O(n) remove_slot キャッシュをdeleted_listに追加する 実際の削除は後でまとめて行う*1 色んな場所から呼ばれる apc_cache_clear apc_cache_expunge apc_cache_insert apc_cache_user_insert apc_cache_find_slot apc_cache_user_find apc_cache_user_delete process_pending_removals deleted_listを走査する ref_countが0以下 削除されてからgc_ttl経過している いずれかの条件に当てはまるキャッシュを削除する キャッシュをfree_slotに渡して実際に削除する キャッシュを追加する際に呼び出される apc_cache_insert apc_cache_user_insert メモ ref_countの役割がよくわからない expungeは必ずしもキャッシュを削除するわけではない ttlが大きかったり全てのキャッシュへのアクセス頻度が高い(メモリの割り当てが少なすぎる)場合は削除されない可能性が高い PHPファイルが読み込まれる度に無駄なループがグルグル回る *1:即座に行う場合もある