ApacheとPHPで生成された動的ファイルを静的キャッシュ化する方法

ApacheサーバーでPHPを使用して動的に生成されるウェブページは、アクセスごとにPHPスクリプトが実行されるため、トラフィックが増加するとサーバー負荷が高まります。特に、頻繁に更新されないページでも毎回動的に生成されると、パフォーマンスが著しく低下します。

これを解決する手段の一つが「静的キャッシュ化」です。動的に生成されたコンテンツをHTMLファイルとして保存し、次回以降のアクセスではその静的ファイルを直接配信することで、PHPスクリプトの実行を回避できます。これにより、サーバーの負荷軽減や表示速度の向上が期待できます。

本記事では、ApacheとPHPを使用して動的に生成されたファイルを静的キャッシュ化する具体的な方法を解説します。静的キャッシュの仕組みや必要性から、実際の設定手順、キャッシュの管理方法、さらにはキャッシュの有効期限や自動更新の設定まで、詳しく紹介します。

この手法を導入することで、動的サイトの運用コストを削減し、ユーザー体験を向上させることができます。

目次
  1. 静的キャッシュの仕組みと必要性
    1. 静的キャッシュのメリット
    2. 静的キャッシュが必要なケース
  2. Apacheのモジュールとキャッシュ方法の概要
    1. 主要なApacheキャッシュモジュール
    2. キャッシュの設定方法
    3. mod_expiresによるキャッシュの有効期限設定
  3. PHPで動的コンテンツを静的ファイルに保存する仕組み
    1. 基本的な仕組み
    2. 実装例: PHPで静的HTMLを生成する
    3. コードの解説
    4. ディレクトリとファイルの権限設定
    5. キャッシュのクリア方法
  4. .htaccessを利用したキャッシュ設定方法
    1. キャッシュの基本設定 (mod_expires)
    2. ETagとLast-Modifiedを活用したキャッシュ制御
    3. キャッシュしたHTMLファイルの配信
    4. キャッシュのクリア
    5. まとめ
  5. 実装例:ブログ記事の静的キャッシュ化
    1. 基本的な仕組み
    2. PHPでブログ記事をキャッシュするコード例
    3. コードのポイント
    4. Apacheでキャッシュファイルを優先的に配信する設定
    5. キャッシュの自動更新スクリプト
    6. 記事の自動キャッシュ更新
    7. まとめ
  6. キャッシュの有効期限管理と自動更新の方法
    1. キャッシュの有効期限を設定する方法
    2. キャッシュの自動更新の方法
    3. まとめ
  7. トラブルシューティング:キャッシュが反映されない場合の対処法
    1. 1. Apacheモジュールが有効になっているか確認
    2. 2. .htaccessファイルが適切に動作しているか確認
    3. 3. キャッシュが機能しているか確認する方法
    4. 4. キャッシュが生成されない場合の確認事項
    5. 5. 強制的にキャッシュを無効化して確認
    6. 6. キャッシュの削除と再生成
    7. まとめ
  8. ApacheとPHPのパフォーマンス最適化
    1. 1. Apacheの設定によるパフォーマンス向上
    2. 2. PHPの設定によるパフォーマンス最適化
    3. 3. キャッシュレイヤの追加 (Redis・Memcached)
    4. 4. キャッシュコントロールヘッダーの適切な設定
    5. まとめ
  9. まとめ

静的キャッシュの仕組みと必要性


動的なウェブサイトは、ユーザーのリクエストごとにサーバー側でPHPスクリプトが実行され、データベースから情報を取得してHTMLを生成します。この処理は、アクセスが集中するサイトではサーバーの負荷を増大させ、レスポンス速度が低下する要因になります。

静的キャッシュとは、一度生成された動的コンテンツをHTMLファイルとして保存し、次回以降のアクセスではPHPスクリプトを介さずに直接そのHTMLファイルを配信する仕組みです。これにより、以下のようなメリットが得られます。

静的キャッシュのメリット

  • 表示速度の向上
    サーバーが動的にHTMLを生成する代わりに、すでに生成済みの静的ファイルを即座に配信するため、ページの表示速度が大幅に向上します。
  • サーバー負荷の軽減
    PHPスクリプトの実行回数を減らすことで、CPUやメモリの消費を抑えることができます。特にトラフィックが多いサイトでは、サーバーの耐久性が向上します。
  • スケーラビリティの向上
    高負荷時でもサーバーが安定し、大量のリクエストにも対応しやすくなります。
  • コスト削減
    高性能なサーバーやスケールアップが不要となり、インフラコストを抑えることができます。

静的キャッシュが必要なケース

  • ブログやニュースサイトなど、コンテンツの更新頻度が比較的低い場合
  • 商品一覧ページのように、情報が定期的に変わるがリアルタイムでなくても問題がない場合
  • イベントページなど、一度公開した後に頻繁に変更されないコンテンツ

静的キャッシュは、サイトの規模や内容に応じて適用することで、ウェブサイト全体のパフォーマンスとユーザー体験を向上させる重要な手法です。

Apacheのモジュールとキャッシュ方法の概要


Apacheには、ウェブサイトのパフォーマンスを向上させるためのキャッシュ機能がいくつか用意されています。これらのモジュールを適切に活用することで、動的コンテンツを効率的にキャッシュし、リクエスト処理を高速化できます。

主要なApacheキャッシュモジュール

  1. mod_cache
  • Apacheの標準キャッシュモジュールで、静的および動的コンテンツのキャッシュを提供します。
  • リクエストごとにキャッシュの有無を確認し、存在する場合はキャッシュからコンテンツを配信します。
  • 対応キャッシュタイプ: ディスクキャッシュ (mod_disk_cache)、メモリキャッシュ (mod_mem_cache)。
  1. mod_expires
  • キャッシュの有効期限を設定するためのモジュールです。ブラウザキャッシュやプロキシキャッシュの制御に使用されます。
  • コンテンツの種類ごとに異なる有効期限を設定可能で、長期的なキャッシュ管理が容易になります。
  1. mod_headers
  • HTTPヘッダーを操作するモジュールで、キャッシュの制御ヘッダー (Cache-Control, ETag, Last-Modified) を設定する際に利用されます。
  • CDNやプロキシサーバーでのキャッシュ制御にも活用されます。
  1. mod_deflate / mod_gzip
  • コンテンツを圧縮して配信するモジュールです。キャッシュ自体には関与しませんが、静的キャッシュされたコンテンツの転送量を削減するために使用されます。

キャッシュの設定方法


キャッシュは、Apacheの設定ファイル (httpd.conf) や .htaccess で簡単に構成できます。以下は、mod_cacheを使った基本的なキャッシュ設定例です。

# mod_cacheの有効化
LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so

# キャッシュの設定
<IfModule mod_cache.c>
    CacheRoot /var/cache/apache2
    CacheEnable disk /
    CacheDirLevels 2
    CacheDirLength 5
    CacheDefaultExpire 3600
    CacheMaxExpire 86400
</IfModule>

mod_expiresによるキャッシュの有効期限設定


特定のファイルタイプに対して、有効期限を指定する例です。

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType text/html "access plus 1 day"
    ExpiresByType image/jpeg "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 week"
</IfModule>

これらのモジュールを組み合わせることで、Apacheでの静的キャッシュの設定が可能となり、サイト全体の応答速度を改善できます。次のセクションでは、PHPで生成された動的コンテンツを静的ファイルとして保存する具体的な方法を解説します。

PHPで動的コンテンツを静的ファイルに保存する仕組み


PHPを使って動的に生成されるページを静的なHTMLファイルとして保存し、次回以降はそのHTMLを直接配信することで、処理速度を大幅に向上させることができます。これは「静的キャッシュ生成」と呼ばれる手法で、特に頻繁に更新されないコンテンツに適しています。

基本的な仕組み

  1. ユーザーが初めてページにアクセスした際にPHPスクリプトが実行され、HTMLが生成されます。
  2. 生成されたHTMLをPHPスクリプトで静的ファイルとしてサーバーに保存します。
  3. 次回のアクセス時には、保存されたHTMLファイルが直接配信されるため、PHPスクリプトは実行されません。
  4. 一定期間または条件によって、キャッシュされたHTMLファイルを自動で更新します。

実装例: PHPで静的HTMLを生成する


以下は、動的ページを静的HTMLファイルとして保存するPHPコードの例です。

<?php
// キャッシュディレクトリの設定
$cache_dir = 'cache/';
$cache_file = $cache_dir . md5($_SERVER['REQUEST_URI']) . '.html';

// キャッシュが存在し、かつ1時間以内のものは配信
if (file_exists($cache_file) && (time() - filemtime($cache_file) < 3600)) {
    readfile($cache_file);
    exit;
}

// 出力バッファリング開始
ob_start();

// 動的コンテンツ生成部分
echo "<html>";
echo "<head><title>動的ページ</title></head>";
echo "<body>";
echo "<h1>これはPHPで生成された動的コンテンツです</h1>";
echo "<p>現在の日時: " . date('Y-m-d H:i:s') . "</p>";
echo "</body></html>";

// バッファの内容を取得してHTMLファイルとして保存
$output = ob_get_contents();
ob_end_flush();
file_put_contents($cache_file, $output);
?>

コードの解説

  • キャッシュディレクトリの指定cache/というディレクトリを作成し、キャッシュファイルをそこに保存します。
  • キャッシュの条件:ファイルの作成時刻が1時間以内であれば、そのままキャッシュを配信します。
  • 動的コンテンツ生成:通常のPHPスクリプトとしてコンテンツを生成し、出力バッファリングを使用してHTMLとして保存します。

ディレクトリとファイルの権限設定


キャッシュディレクトリが書き込み可能である必要があります。以下のコマンドで適切な権限を設定します。

mkdir cache
chmod 755 cache

キャッシュのクリア方法


古くなったキャッシュをクリアするために、次のような簡単なスクリプトを用意できます。

<?php
array_map('unlink', glob("cache/*.html"));
echo "キャッシュをクリアしました。";
?>

この方法を導入することで、動的サイトの応答速度を劇的に向上させ、サーバーの負荷を軽減できます。次のセクションでは、.htaccessを使ったキャッシュの制御方法について詳しく解説します。

.htaccessを利用したキャッシュ設定方法


Apacheでは、.htaccessファイルを使ってキャッシュの設定を行うことができます。これにより、ブラウザキャッシュやサーバーキャッシュを細かく制御し、サーバーの負荷軽減とページ表示速度の向上を実現できます。

ここでは、.htaccessを使用して静的キャッシュを設定する具体的な方法を解説します。

キャッシュの基本設定 (mod_expires)


mod_expiresを使用して、特定のファイルタイプごとにキャッシュの有効期限を設定します。これにより、ブラウザがローカルに保存したキャッシュを一定期間使用し、サーバーへのリクエストを減らせます。

# mod_expiresを有効化
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 1 week"

    # HTMLファイルは1日キャッシュ
    ExpiresByType text/html "access plus 1 day"

    # CSSファイルは1週間キャッシュ
    ExpiresByType text/css "access plus 1 week"

    # 画像ファイルは1か月キャッシュ
    ExpiresByType image/jpeg "access plus 1 month"
    ExpiresByType image/png "access plus 1 month"
    ExpiresByType image/gif "access plus 1 month"

    # JavaScriptファイルは1週間キャッシュ
    ExpiresByType application/javascript "access plus 1 week"
</IfModule>


解説

  • ExpiresActive On:キャッシュの有効化。
  • ExpiresDefault:すべてのファイルのデフォルト有効期限を設定。
  • ExpiresByType:ファイルタイプごとに異なるキャッシュ期間を指定可能。

ETagとLast-Modifiedを活用したキャッシュ制御


ブラウザがキャッシュしたファイルが最新かどうかを判定する仕組みとして、ETagLast-Modifiedを使用します。

# ETagの有効化
<IfModule mod_headers.c>
    Header unset ETag
    FileETag None
</IfModule>

# Last-Modifiedの設定
<IfModule mod_headers.c>
    Header set Cache-Control "max-age=3600, must-revalidate"
</IfModule>


解説

  • ETagはサーバーの負荷が高くなる場合があるため、必要に応じて無効化します。
  • Cache-Controlヘッダーを使って、キャッシュの最大有効期限 (max-age) を1時間に設定します。

キャッシュしたHTMLファイルの配信


PHPで生成した静的HTMLキャッシュを自動的に配信する設定を.htaccessで行います。

# キャッシュHTMLファイルの優先配信
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{DOCUMENT_ROOT}/cache%{REQUEST_URI}.html -f
    RewriteRule ^(.*)$ /cache%{REQUEST_URI}.html [L]
</IfModule>


解説

  • リクエストがあるたびに、cacheディレクトリ内のキャッシュされたHTMLファイルが存在する場合は、それを直接配信します。
  • PHPスクリプトの実行を回避し、静的HTMLファイルが配信されます。

キャッシュのクリア


キャッシュのクリアも.htaccessで制御できます。特定の条件でキャッシュを強制的に無効化する方法です。

<IfModule mod_headers.c>
    <FilesMatch "\.(html|css|js|png|jpg|gif)$">
        Header set Cache-Control "no-cache, no-store, must-revalidate"
        Header set Pragma "no-cache"
        Header set Expires 0
    </FilesMatch>
</IfModule>


解説

  • 特定のファイルタイプに対してキャッシュを無効化し、最新のコンテンツが常に配信されるようになります。

まとめ


.htaccessを利用したキャッシュ設定は、Apacheサーバーで簡単に導入できる方法です。mod_expiresmod_headersを活用し、ファイルタイプごとのキャッシュルールを柔軟に設定することで、ウェブサイトの応答速度向上とサーバー負荷軽減が期待できます。次のセクションでは、実際にPHPを使ってブログ記事などの動的ページを静的にキャッシュ化する具体的な例を解説します。

実装例:ブログ記事の静的キャッシュ化


PHPで動的に生成されるブログ記事を静的HTMLとしてキャッシュし、Apacheで効率的に配信する方法を具体例として紹介します。この記事では、リクエストごとに記事が動的に生成される仕組みを、静的ファイルに置き換えるプロセスを示します。

基本的な仕組み

  • 訪問者がブログ記事にアクセスした際に、PHPがデータベースから記事を取得してHTMLを生成します。
  • 生成されたHTMLはキャッシュディレクトリに保存され、次回以降のアクセスではその静的HTMLファイルが直接配信されます。
  • 記事が更新された場合は、新しい記事がキャッシュされるようにPHPでキャッシュの上書きを行います。

PHPでブログ記事をキャッシュするコード例

<?php
// 設定
$cache_dir = 'cache/'; // キャッシュを保存するディレクトリ
$cache_time = 3600;    // キャッシュの有効期間 (秒)
$slug = isset($_GET['article']) ? $_GET['article'] : 'default';
$cache_file = $cache_dir . $slug . '.html';

// キャッシュが存在し、有効期間内なら静的HTMLを配信
if (file_exists($cache_file) && (time() - filemtime($cache_file) < $cache_time)) {
    readfile($cache_file);
    exit;
}

// 出力バッファリング開始
ob_start();

// 動的に記事を生成 (例: データベースから記事を取得)
echo "<html>";
echo "<head><title>ブログ記事: " . htmlspecialchars($slug) . "</title></head>";
echo "<body>";
echo "<h1>ブログ記事:" . htmlspecialchars($slug) . "</h1>";
echo "<p>この記事は" . date('Y-m-d H:i:s') . "に生成されました。</p>";
echo "</body></html>";

// バッファの内容を取得し、キャッシュディレクトリに保存
$output = ob_get_contents();
ob_end_flush();
file_put_contents($cache_file, $output);
?>

コードのポイント

  • スラッグ (slug):URLパラメータを基に記事を特定します。例:example.com/article.php?article=my-post
  • キャッシュの存在確認:キャッシュファイルが存在し、有効期限内なら直接配信します。
  • 動的コンテンツの生成:PHPで記事を生成し、HTMLとして保存します。
  • バッファリングの利用ob_start()ob_end_flush()で出力をバッファし、キャッシュファイルとして保存します。

Apacheでキャッシュファイルを優先的に配信する設定


.htaccessファイルで、キャッシュされたHTMLが存在する場合はそれを配信し、存在しない場合のみPHPを実行する設定を行います。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{DOCUMENT_ROOT}/cache/%{REQUEST_URI}.html -f
    RewriteRule ^(.*)$ /cache/%{REQUEST_URI}.html [L]
</IfModule>

解説

  • キャッシュが存在する場合はcache/ディレクトリから直接HTMLを配信します。
  • 記事が存在しない場合は通常のPHPスクリプトが実行されます。

キャッシュの自動更新スクリプト


記事が更新された際にキャッシュを削除するスクリプトも用意します。これにより、新しい記事が反映されます。

<?php
$slug = isset($_GET['article']) ? $_GET['article'] : 'default';
$cache_file = 'cache/' . $slug . '.html';

if (file_exists($cache_file)) {
    unlink($cache_file);
    echo "キャッシュを削除しました。";
} else {
    echo "キャッシュが見つかりません。";
}
?>

記事の自動キャッシュ更新


記事を保存・更新するタイミングでこのスクリプトを実行することで、古いキャッシュが自動的に削除されます。

まとめ


PHPとApacheを組み合わせた静的キャッシュ化は、ブログやニュースサイトのパフォーマンスを大幅に向上させます。特にアクセス数の多いページでは、サーバー負荷を軽減し、ユーザーエクスペリエンスの向上に寄与します。次のセクションでは、キャッシュの有効期限と自動更新の方法について解説します。

キャッシュの有効期限管理と自動更新の方法


キャッシュの有効期限を適切に設定し、古いキャッシュを自動的に更新することは、動的サイトの精度とパフォーマンスを両立させる上で重要です。ここでは、PHPとApacheを使ったキャッシュの有効期限管理と、自動的にキャッシュを更新する方法を解説します。

キャッシュの有効期限を設定する方法


PHPとApacheの両方でキャッシュの有効期限を制御できます。

PHPでキャッシュの有効期限を設定する


PHPでは、キャッシュファイルの作成時刻と現在時刻を比較して、有効期限が切れている場合に新しいキャッシュを生成します。

<?php
$cache_dir = 'cache/';
$slug = isset($_GET['article']) ? $_GET['article'] : 'default';
$cache_file = $cache_dir . $slug . '.html';
$cache_time = 3600; // 1時間 (3600秒)

// キャッシュが存在し、有効期限内なら配信
if (file_exists($cache_file) && (time() - filemtime($cache_file) < $cache_time)) {
    readfile($cache_file);
    exit;
}

// 動的ページを生成 (バッファリング)
ob_start();
echo "<html>";
echo "<head><title>キャッシュテスト</title></head>";
echo "<body><h1>記事:" . htmlspecialchars($slug) . "</h1>";
echo "<p>生成日時:" . date('Y-m-d H:i:s') . "</p></body></html>";

// キャッシュを保存
$output = ob_get_contents();
ob_end_flush();
file_put_contents($cache_file, $output);
?>


解説

  • キャッシュの有効期限$cache_timeで管理し、1時間をデフォルトとしています。
  • ファイルの最終更新時刻 (filemtime) を取得し、現在時刻との差が$cache_timeを超えた場合に新しいキャッシュを生成します。

Apache (.htaccess) でブラウザキャッシュの有効期限を設定する


ブラウザ側でのキャッシュ制御は.htaccessで行います。

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType text/html "access plus 1 hour"
    ExpiresByType image/jpeg "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 week"
</IfModule>


解説

  • HTMLのキャッシュは1時間、画像は1か月など、ファイルタイプごとに異なる有効期限を設定します。
  • mod_expiresを利用して、キャッシュ期間を柔軟に調整できます。

キャッシュの自動更新の方法


キャッシュを自動的に更新する方法として、以下のアプローチがあります。

方法1:定期的にキャッシュをクリアする (Cronジョブ)


サーバーで定期的にキャッシュを削除するスクリプトを実行します。

# 1日1回キャッシュを削除
0 0 * * * php /var/www/html/clear_cache.php


PHPスクリプト (clear_cache.php)

<?php
array_map('unlink', glob("cache/*.html"));
echo "すべてのキャッシュを削除しました。";
?>


解説

  • Cronジョブで定期的にPHPスクリプトを実行し、キャッシュを削除します。
  • glob("cache/*.html")でキャッシュディレクトリ内のHTMLファイルを取得し、すべて削除します。

方法2:特定の記事更新時にキャッシュをクリア


記事が更新された際に該当するキャッシュを削除する方法です。

<?php
$slug = isset($_GET['article']) ? $_GET['article'] : 'default';
$cache_file = 'cache/' . $slug . '.html';
if (file_exists($cache_file)) {
    unlink($cache_file);
    echo "キャッシュを削除しました。";
}
?>


解説

  • 記事が更新された際に、自動で古いキャッシュが削除され、新しいキャッシュが生成されます。

方法3:バージョニングによるキャッシュ無効化


URLにバージョン番号を付与し、キャッシュを強制的に更新する方法です。

echo '<script src="app.js?v=' . time() . '"></script>';


解説

  • v=timestampのように、URLの末尾にバージョンを付与してキャッシュを無効化します。
  • コンテンツが更新されるたびに異なるバージョンが適用されるため、古いキャッシュは参照されません。

まとめ


キャッシュの有効期限と自動更新を適切に設定することで、パフォーマンスとリアルタイム性を両立できます。PHPによるキャッシュ生成とApacheでのキャッシュ制御を組み合わせることで、効率的なキャッシュ管理が可能になります。次のセクションでは、キャッシュが反映されない場合のトラブルシューティングについて解説します。

トラブルシューティング:キャッシュが反映されない場合の対処法


キャッシュを導入しても意図した通りに反映されない場合があります。これは設定ミスやサーバー構成の問題が原因となることが多く、適切にデバッグして解消する必要があります。ここでは、キャッシュが反映されない際の具体的な対処法を紹介します。

1. Apacheモジュールが有効になっているか確認


Apacheのキャッシュ関連モジュールが有効になっていないと、.htaccessの設定が反映されません。以下のコマンドで必要なモジュールを確認・有効化します。

apachectl -M | grep cache


必要なモジュールが表示されない場合は、有効化します。

sudo a2enmod cache
sudo a2enmod cache_disk
sudo a2enmod expires
sudo a2enmod headers
sudo systemctl restart apache2


解説

  • mod_cachemod_cache_diskmod_expiresmod_headersが必要です。
  • 有効化後はApacheを再起動して反映させます。

2. .htaccessファイルが適切に動作しているか確認


.htaccessファイル自体が無効になっている可能性があります。Apacheの設定ファイル (/etc/apache2/apache2.confなど) に以下の設定があることを確認します。

<Directory /var/www/html>
    AllowOverride All
</Directory>


対処法

  • AllowOverride None になっている場合は AllowOverride All に変更し、Apacheを再起動します。
sudo systemctl restart apache2

3. キャッシュが機能しているか確認する方法


ブラウザのデベロッパーツールでキャッシュの有無を確認できます。

  1. Chromeの場合
  • F12キーを押して「ネットワーク」タブを開きます。
  • キャッシュ対象のリソースを確認し、「ステータスコード」が304(Not Modified) ならキャッシュが有効です。
  1. 確認用ヘッダーの追加
    .htaccessでキャッシュの動作を確認するために、ヘッダーを追加します。
<IfModule mod_headers.c>
    Header set X-Cache-Status "HIT from Apache"
</IfModule>


解説

  • キャッシュがヒットした場合に、X-Cache-Statusヘッダーが付与されます。これにより、キャッシュの状態を簡単に確認できます。

4. キャッシュが生成されない場合の確認事項


問題1:キャッシュディレクトリの権限が不足している
キャッシュを保存するディレクトリの権限が不足している可能性があります。

sudo chmod -R 755 /var/www/html/cache
sudo chown -R www-data:www-data /var/www/html/cache

問題2:PHPスクリプトでキャッシュが保存されない
PHPスクリプトにファイル保存処理が正しく記述されているか確認します。

file_put_contents($cache_file, $output);


失敗している場合はエラーを出力します。

if (!file_put_contents($cache_file, $output)) {
    error_log("キャッシュファイルの保存に失敗しました: " . $cache_file);
}

5. 強制的にキャッシュを無効化して確認


キャッシュの影響で古いコンテンツが表示され続ける場合は、一時的にキャッシュを無効化して動作を確認します。

<IfModule mod_headers.c>
    Header set Cache-Control "no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires 0
</IfModule>


ブラウザキャッシュをクリアし、最新の状態でサイトを確認します。

6. キャッシュの削除と再生成


キャッシュが古いまま更新されない場合は、以下のスクリプトでキャッシュを削除して再生成します。

<?php
array_map('unlink', glob("cache/*.html"));
echo "キャッシュを削除しました。";
?>

まとめ


キャッシュが反映されない場合は、Apacheモジュールの確認、.htaccessの設定、キャッシュディレクトリの権限などを順番に確認して問題を特定します。キャッシュの仕組みを正しく理解し、適切なデバッグを行うことで、安定したキャッシュ環境を構築できます。次のセクションでは、ApacheとPHPのパフォーマンス最適化について解説します。

ApacheとPHPのパフォーマンス最適化


ApacheとPHPの設定を適切に調整することで、動的コンテンツを効率的にキャッシュし、サイト全体のパフォーマンスを大幅に向上させることができます。ここでは、ApacheとPHPのパフォーマンスを最適化する具体的な方法を解説します。

1. Apacheの設定によるパフォーマンス向上

mod_deflate / mod_gzipを使用したコンテンツ圧縮


HTML、CSS、JavaScriptなどのテキストベースのファイルは圧縮して送信することで、転送量を削減しページの読み込み速度を向上させます。

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css
    AddOutputFilterByType DEFLATE application/javascript application/json
</IfModule>


解説

  • Apacheのmod_deflateモジュールを使用して、テキストファイルを圧縮します。
  • JavaScriptやCSSも圧縮対象とすることで、トータルの転送量を削減します。

KeepAliveの有効化


KeepAliveは、複数のリクエストを単一の接続で処理することで、接続のオーバーヘッドを削減します。

KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5


解説

  • KeepAlive Onで複数のリクエストを同じ接続で処理します。
  • MaxKeepAliveRequestsは1つの接続で処理できる最大リクエスト数を指定します。

不要なモジュールの無効化


Apacheにはデフォルトで多くのモジュールが有効化されていますが、使用しないモジュールを無効にすることで、処理速度を向上させることができます。

sudo a2dismod autoindex
sudo a2dismod status
sudo systemctl restart apache2


解説

  • autoindexstatusなど、不要なモジュールを無効化してメモリ消費を削減します。

2. PHPの設定によるパフォーマンス最適化

OPcacheの有効化


PHPスクリプトのコンパイル結果をキャッシュし、次回以降のリクエストで再コンパイルを回避することで、PHPの実行速度が大幅に向上します。

; php.iniの設定
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60


解説

  • opcache.enable=1 でOPcacheを有効化します。
  • メモリ使用量 (memory_consumption) や、キャッシュするファイル数 (max_accelerated_files) を適切に設定します。

PHP-FPMの導入


PHP-FPM (FastCGI Process Manager) を使用すると、PHPの処理を高速化し、大量のアクセスに対してスケーラブルに対応できます。

sudo apt install php-fpm

ApacheでPHP-FPMを利用するための設定を行います。

<FilesMatch \.php$>
    SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>


解説

  • PHP-FPMはPHPスクリプトをFastCGIプロセスとして処理し、パフォーマンスを向上させます。

リアルタイムで不要なエラー出力を抑制


本番環境ではPHPエラーの出力を抑制し、処理速度を改善します。

display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log

3. キャッシュレイヤの追加 (Redis・Memcached)


PHPとApacheの間にキャッシュレイヤを追加することで、データベースクエリやセッション処理を高速化できます。

Redisの導入

sudo apt install redis-server php-redis


PHPでRedisを使用

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->set("key", "value");
echo $redis->get("key");
?>

4. キャッシュコントロールヘッダーの適切な設定


ブラウザキャッシュを適切に制御し、サーバーの負荷を軽減します。

<IfModule mod_headers.c>
    Header set Cache-Control "max-age=86400, public"
</IfModule>


解説

  • max-age=86400 でブラウザキャッシュを1日有効にします。

まとめ


ApacheとPHPのパフォーマンス最適化は、サイト全体の速度と安定性を向上させ、ユーザー体験を向上させます。圧縮、KeepAlive、OPcache、PHP-FPMの導入などを組み合わせることで、リクエスト処理速度を大幅に改善できます。次のセクションでは、記事全体のまとめを行います。

まとめ


本記事では、ApacheとPHPで生成される動的コンテンツを静的にキャッシュ化する方法について解説しました。

静的キャッシュ化は、動的コンテンツの処理負荷を軽減し、ページの表示速度を向上させる効果的な手法です。Apacheのmod_cachemod_expiresを活用し、PHPで動的ページをHTMLとしてキャッシュすることで、大量のリクエストにも効率的に対応できます。

さらに、キャッシュの有効期限管理や自動更新、トラブルシューティング方法を通じて、安定したキャッシュ環境を構築する具体的な手順を紹介しました。加えて、ApacheとPHPのパフォーマンス最適化として、OPcacheの有効化やPHP-FPMの導入、mod_deflateを用いた圧縮設定などを取り入れることで、サイトの応答速度とスケーラビリティを向上させることができます。

これらの手法を組み合わせることで、動的サイトでも高速なページ配信が可能となり、ユーザー体験が向上し、SEOのパフォーマンス向上にも寄与します。ぜひ本記事を参考に、実践してみてください。

コメント

コメントする

目次
  1. 静的キャッシュの仕組みと必要性
    1. 静的キャッシュのメリット
    2. 静的キャッシュが必要なケース
  2. Apacheのモジュールとキャッシュ方法の概要
    1. 主要なApacheキャッシュモジュール
    2. キャッシュの設定方法
    3. mod_expiresによるキャッシュの有効期限設定
  3. PHPで動的コンテンツを静的ファイルに保存する仕組み
    1. 基本的な仕組み
    2. 実装例: PHPで静的HTMLを生成する
    3. コードの解説
    4. ディレクトリとファイルの権限設定
    5. キャッシュのクリア方法
  4. .htaccessを利用したキャッシュ設定方法
    1. キャッシュの基本設定 (mod_expires)
    2. ETagとLast-Modifiedを活用したキャッシュ制御
    3. キャッシュしたHTMLファイルの配信
    4. キャッシュのクリア
    5. まとめ
  5. 実装例:ブログ記事の静的キャッシュ化
    1. 基本的な仕組み
    2. PHPでブログ記事をキャッシュするコード例
    3. コードのポイント
    4. Apacheでキャッシュファイルを優先的に配信する設定
    5. キャッシュの自動更新スクリプト
    6. 記事の自動キャッシュ更新
    7. まとめ
  6. キャッシュの有効期限管理と自動更新の方法
    1. キャッシュの有効期限を設定する方法
    2. キャッシュの自動更新の方法
    3. まとめ
  7. トラブルシューティング:キャッシュが反映されない場合の対処法
    1. 1. Apacheモジュールが有効になっているか確認
    2. 2. .htaccessファイルが適切に動作しているか確認
    3. 3. キャッシュが機能しているか確認する方法
    4. 4. キャッシュが生成されない場合の確認事項
    5. 5. 強制的にキャッシュを無効化して確認
    6. 6. キャッシュの削除と再生成
    7. まとめ
  8. ApacheとPHPのパフォーマンス最適化
    1. 1. Apacheの設定によるパフォーマンス向上
    2. 2. PHPの設定によるパフォーマンス最適化
    3. 3. キャッシュレイヤの追加 (Redis・Memcached)
    4. 4. キャッシュコントロールヘッダーの適切な設定
    5. まとめ
  9. まとめ