1. 導入
Windows環境(IIS + PHP)でWinCacheを利用している際、「設定ファイルやテンプレートファイルをPHPから書き換えたのに、反映されるまでにタイムラグがある」という問題に直面したことはありませんか?WinCacheはデフォルトで30秒間隔のキャッシュチェックを行っているため、更新直後は古い内容が読み込まれてしまうことがあります。本記事では、この課題を解決し、キャッシュを即座に最新状態へ更新する関数「wincache_refresh_if_changed」の活用法を解説します。
2. 基礎知識
WinCacheは、Windows上のPHPパフォーマンスを向上させるための拡張モジュールです。主な機能として、PHPスクリプトのコンパイル済みコードを保持する「Opcodeキャッシュ」や、ファイル内容を保持する「ファイルキャッシュ」があります。
通常、WinCacheはファイルの更新日時(mtime)を自動監視していますが、監視間隔(wincache.fcachesizeやwincache.statfiletimeout設定)に依存するため、リアルタイム性は保証されません。特に、設定ファイルやデータベース接続情報などをPHP自身が動的に書き換える管理画面を持つシステムでは、この「遅延」が致命的なバグや不整合を招く可能性があります。
3. 実装/解決策
wincache_refresh_if_changed関数を使用することで、特定のファイルに対するキャッシュエントリを強制的に無効化し、再読み込みを促すことができます。
引数にファイルパスの配列を渡すことで、特定のファイルのみを対象に更新をかけることが可能です。引数を指定しない場合は、キャッシュ全体を対象にリフレッシュが実行されます。システムへの負荷を考慮し、基本的には更新された対象ファイルのみをピンポイントで指定するのがベストプラクティスです。
4. サンプルプログラム
以下は、設定ファイルを書き換えた直後にキャッシュをクリアする、実用的な実装例です。
/
$configFilePath = ‘C:\inetpub\wwwroot\config.php’;
// 設定ファイルを書き込む処理
$content = ‘ false, “version” => “1.0.1”]; ?>’;
$result = file_put_contents($configFilePath, $content);
if ($result !== false) {
// 書き込み成功後、即座にWinCacheのキャッシュを更新する
// これにより、次にinclude/requireされた際に最新の内容が読み込まれる
$refreshed = wincache_refresh_if_changed([$configFilePath]);
if ($refreshed) {
echo “設定ファイルの更新とキャッシュのクリアが完了しました。”;
} else {
echo “キャッシュの更新に失敗しました。”;
}
} else {
echo “設定ファイルの書き込みに失敗しました。”;
}
?>
5. 応用・注意点
・パフォーマンスへの影響:wincache_refresh_if_changedはリフレッシュ処理を行うため、頻繁に呼び出しすぎるとシステム全体のパフォーマンスを低下させる可能性があります。あくまで「ファイル更新時のみ」に限定して使用してください。
・権限の問題:IISのアプリケーションプールを実行しているユーザー(IUSRや特定のサービスアカウント)が、対象ファイルに対して書き込み権限とキャッシュ更新権限を持っていることを確認してください。
・デバッグ時の活用:開発環境でキャッシュが原因の不可解な挙動が発生した際、一時的に全キャッシュをリフレッシュする処理を入れることで、キャッシュ起因の問題かどうかを切り分けるデバッグ手法としても有効です。