こういった現象は、開発者なら誰もが一度は頭を悩ませたことがあるでしょう。
この問題は、Webサイトを高速化するための「キャッシュ」という仕組みが深く関わっています。
キャッシュは便利な反面、更新内容をすぐに確認したい開発時においては、しばしば厄介な存在となります。
そこでこの記事では、PHP開発におけるキャッシュ問題を解決するためのアプローチを徹底解説します。
CSSが反映されない時の一般的なブラウザキャッシュの制御から、Laravelフレームワーク特有のキャッシュクリアコマンド、サーバーサイドのOPcacheまで、網羅的に紹介しますので、是非参考にしてください。
【本記事の信頼性】
- 執筆者は元エンジニア
- 大手プログラミングスクールのWebディレクター兼ライターを経験
- 自らも地元密着型のプログラミングスクールを運営
受講生から評判の良いプログラミングスクール
スクール |
特徴 |
受講料金 |
大手比較サイトで4年連続人気NO.1!受講生からの評判も非常に高く、Web系のエンジニアを目指すならRUNTEQ一択。 | 550,000円(給付金適用あり) | |
月単価80万円以上の現役エンジニア講師による指導!一度入会すればサポートは半永久的。 | 498,000円 | |
格安で質の高いWeb制作スキルを習得したい人におすすめ!業界最安級の料金でありながら、コミュニティやサポートが充実。 | 129,800円~ | |
完全無料でプログラミングが学べる貴重なスクール!最短1ヶ月で卒業可能。ゼロスク運営会社への就職もできる。 | 無料 | |
長期間に渡って学習し、希少人材を目指す人に最適なスクール!受講料は高いものの、高収入を得られる人材を目指せる。 | 96~132万円 |
キャッシュは2種類ある!ブラウザとサーバーサイド
まず理解すべきなのは、「キャッシュ」と呼ばれるものは、大きく分けて2つの種類が存在する点です。(細かく分ければもっとあります)
問題の原因がどちらにあるのかを切り分けることが、解決への第一歩となります。
1つめが「ブラウザキャッシュ(クライアントサイド)」です。
これは、ユーザーのWebブラウザが、画像やCSS、JavaScriptといった静的ファイルをPCやスマートフォン内に一時的に保存しておく仕組みで、次回アクセス時に、手元のファイルを使うことで表示を高速化させます。
CSSやJavaScriptの変更が反映されない問題のほとんどは、このブラウザキャッシュが原因です。
2つめが「サーバーサイドキャッシュ」です。
サーバーサイドキャッシュは、Webサーバー側で、PHPスクリプトの実行結果や設定情報などを一時的に保存しておく仕組みです。
これには、PHPコードの実行を高速化する「OPcache」や、Laravelのようなフレームワークが独自に生成する設定キャッシュ、ビューキャッシュなど、様々な種類が含まれます。
PHPのコードを変更したのに挙動が変わらない場合は、こちらが原因かもしれません。
方法1:ブラウザキャッシュをPHPで制御する(CSS/JSの更新に)
静的ファイル(CSS、JavaScript、画像など)の更新がブラウザに反映されないという「最も一般的な問題」への対処法です。
現在、最も推奨されるベストプラクティスは、ファイルのURLに「ファイルの最終更新日時」を付与する方法です。
ファイルが更新されるとURLも自動的に変わるため、ブラウザは「これは新しいファイルだ」と判断し、キャッシュを使わずにサーバーから再取得します。
ファイルが更新されていなければURLは変わらないため、キャッシュが有効に活用されます。
開発者もユーザーもキャッシュを意識する必要がない、非常にスマートな解決策です。
サンプルコード
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>動的キャッシュクリア</title>
<?php
// style.cssの最終更新日時をタイムスタンプで取得
$file_time = filemtime('css/style.css');
?>
<!-- CSSの読み込みURLに、クエリとして最終更新日時を付与 -->
<link rel="stylesheet" href="css/style.css?v=<?php echo $file_time; ?>">
</head>
<body>
<h1>CSSが更新されると、自動でキャッシュがクリアされます</h1>
</body>
</html>
ソースコードの解説
PHPのfilemtime()
関数は、指定したファイルの最終更新日時を取得します。
このコードでは、style.css
の更新日時を取得し、それを?v=
というクエリパラメータとしてhref
属性に追加しています。
style.css
を上書き保存すると$file_time
の値が変わり、ブラウザが読み込むURLも変化するため、強制的に最新のファイルが読み込まれる仕組みです。
方法2:Laravelのキャッシュをクリアする(フレームワーク開発)
Laravelのような高機能なフレームワークは、パフォーマンスを向上させるために、設定情報、ルーティング情報、ビュー(HTMLテンプレート)などをファイルとしてキャッシュします。
そのため、.env
ファイルや設定ファイル、Bladeテンプレートを編集した際には、これらのキャッシュを意図的にクリアする必要が出てきます。
Laravelでは、artisan
というコマンドラインツールを使って、これらのキャッシュを簡単に管理できます。
artisanコマンドの基本
プロジェクトのルートディレクトリで、ターミナルから以下の形式でコマンドを実行します。
php artisan [コマンド名]
アプリケーションキャッシュ (php artisan cache:clear)
Cache
ファサードなどを使ってアプリケーション内で意図的に保存したキャッシュを削除します。
一般的なデータキャッシュが対象となります。
データベースのクエリ結果などをキャッシュしている場合に、このコマンドでクリアすることが可能です。
設定キャッシュ (php artisan config:clear)
config
ディレクトリ内の設定ファイルは、パフォーマンス向上のために一つのファイルに結合・キャッシュされます。
.env
ファイルやconfig/app.php
などを変更したのに設定が反映されない場合は、このコマンドを実行してください。
本番環境へデプロイした際には、php artisan config:cache
でキャッシュを作成し直すのが一般的です。
ルートキャッシュ (php artisan route:clear)
routes/web.php
などに記述されたルーティング情報も、高速化のためにキャッシュされます。
ルートの追加や変更が反映されない場合に、このコマンドでキャッシュをクリアします。
ビューキャッシュ (php artisan view:clear)
Bladeテンプレートファイル(.blade.php
)は、初回アクセス時にコンパイルされてプレーンなPHPファイルとしてキャッシュされます。
HTMLの修正が反映されない場合は、このコマンドでビューキャッシュを削除してください。
すべてを一度にクリアするコマンド (php artisan optimize:clear)
上記のconfig:clear
、route:clear
、view:clear
など、主要なキャッシュをまとめてクリアしてくれる便利なコマンドです。
どのキャッシュが原因か分からない場合に、まず試してみるとよいでしょう。
方法3:サーバーサイドキャッシュ(OPcache)をクリアする
フレームワークを使っていない素のPHP環境で、PHPファイル自体の変更が反映されない場合は、サーバーサイドのOPcacheが原因かもしれません。
OPcacheは、PHPコードを初回実行時にコンパイルした結果(オペコード)をメモリ上にキャッシュし、次回以降の実行を高速化するPHPの拡張機能です。
通常はファイルの更新を自動検知しますが、設定によってはその検知が遅れることがあります。
このような場合に、OPcacheのキャッシュを強制的にリセットするのがopcache_reset()
関数です。
サンプルコード
<?php
// OPcacheが有効な場合のみリセットを実行
if (function_exists('opcache_reset')) {
if (opcache_reset()) {
echo 'OPcacheのキャッシュをクリアしました。';
} else {
echo 'OPcacheのキャッシュクリアに失敗しました。';
}
} else {
echo 'OPcacheは有効ではありません。';
}
?>
このコードを実行すると、サーバー上のOPcacheがすべてリセットされ、次回からPHPファイルが再コンパイルされます。
ただし、サーバー全体のパフォーマンスに影響を与える可能性があるため、デプロイ後や最終手段として利用してください。
その他のフレームワークでのキャッシュクリア
Laravel以外のフレームワークでも、同様に専用のキャッシュクリアコマンドが用意されています。
- Symfony:
php bin/console cache:clear
- CakePHP:
bin/cake cache clear_all
フレームワークを使用している場合は、まずそのフレーム-ワークの公式ドキュメントでキャッシュの管理方法を確認することが重要です。
まとめ
今回は、PHP開発におけるキャッシュクリアの方法を、様々な角度から解説しました。
なお、PHPを体系的に学んだり、PHPのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。