2019-12-09

Opcacheによる不要ファイルの検知

PHPのOpcacheの関数を使うと参照されていないコード(不要ファイル)を確認することができます。

例えばこんな感じなファイルを作ってアクセスするとOpcacheに載っているファイル一覧を取得できます。

<?php

header("Content-Type: text/csv");
define('CACHEPREFIX', function_exists('opcache_reset')?'opcache_':(function_exists('accelerator_reset')?'accelerator_':''));

$status = call_user_func(CACHEPREFIX.'get_status');
foreach ($status['scripts'] as $data) {
    echo $data['full_path'] . "\t" . $data['hits'] . PHP_EOL;
}

出力されたファイル一覧と実ファイル一覧を付け合わせることで、参照されていないコードを確認できます。

SAPIごとに管理されているようで、CLIとWeb(mod_phpとか)は別のOpcacheが使われているのでWebで参照されているかどうかを見る場合には CLIではなくWebからアクセスしてPHPを実行させる必要があるっぽいです。

また、設定値によってOpcacheに載ってくる条件も多少変わってくるので注意です。 例えばファイルベースのOpcacheが有効でない場合は再起動後はキャッシュがクリアされていたり、max_accelerated_filesが少ないと載らないファイルも出てくると思います。

このエントリーをはてなブックマークに追加