読者です 読者をやめる 読者になる 読者になる

FuelPHPでページキャッシュ

PHP FuelPHP

FuelPHPでページを丸々キャッシュする方法を調べたところ、『fuel-pagecache』というのを作っている方がいたので、試してみました。

fuel-pagecache)
https://github.com/xavividal/fuel-pagecache

以下のような動作になっています。

  • Templateコントローラで出力したコンテンツを静的ファイルに出力
  • mod_rewriteで静的ファイルに振り分け


1度キャッシュしてしまうと、その後はmod_rewriteでの振り分けになる為、当然ながらコンテンツ更新が行われてもキャッシュはクリアされません。
加えて、ページキャッシュの有効期限等も存在しない為、ページ更新時はページキャッシュを削除してやる必要があります。


以下、設定内容になります。

ファイル配置

githubよりfuel-pagecacheを取得し、以下にそれぞれ配置します。

  • fuel/app/config/fuel-pagecache.php
  • fuel/app/config/pagecache.php

Autoloader設定

『fuel/app/bootstrap.php』に以下を記述します。

Autoloader::add_core_namespace('Xvp');

Autoloader::add_classes(array(
    ...
    'Xvp\\Pagecache' => __DIR__.'/classes/pagecache.php'
));

キャッシュディレクトリ作成

ドキュメントルート直下にキャッシュ用ディレクトリを作成します。

$ mkdir {ドキュメントルート}/cache
$ chmod 777 {ドキュメントルート}/cache

Controller

ページキャッシュを行いたいTemplateコントローラにて、『before()』『after()』の設定を行い、キャッシュしたいaction内で『$this->pagecache->enableCache();』を呼び出します。

<?php
class Controller_Cachetest extends Controller_Template
{
    public function before()
    {
        parent::before();

        $this->pagecache = new Pagecache();
        $this->pagecache->setResponse($this->response);
        $this->pagecache->setRequest($this->request);
    }

    public function after($response)
    {
        $response = parent::after($response);

        if ($this->pagecache->isCacheable()) {
           $this->pagecache->cache($_SERVER['REQUEST_URI']);
        }

        return $response;
    }

    public function action_index()
    {
        $this->pagecache->enableCache();

        ...
    }
}

.htaccess設定

.htaccessにて以下の設定を行います。

RewriteRule ^/(.*)/$ /$1 [QSA]
RewriteRule ^$ cache/index.html [QSA]
RewriteRule ^([^.]+)/$ cache/$1/index.html [QSA]
RewriteRule ^([^.]+)$ cache/$1/index.html [QSA]

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d

RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

上記設定後、『$this->pagecache->enableCache()』を設定したページにアクセスすると、cacheディレクトリに静的ファイルが出力され、次回以降のアクセスは静的ファイルが参照される事になります。
cacheディレクトリ内静的ファイルに、適当な文字列を記述するなどして、キャッシュに振り分けられてるかの確認が可能です。