第7回 キャッシュを導入して、快適なページ表示を実現する - マッシュアップ講座

ZAPA先生のマッシュアップ講座

Lecutures on PHP

第7回 キャッシュを導入して、快適なページ表示を実現する (その1)

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

キャッシュを導入して、快適なページ表示を実現する

前回まで、各WebサービスAPIの利用方法とマッシュアップサイトの作り方を解説してきました。実はAPIを利用したサイトを運営していると、以下の3つの問題点が浮き彫りになります。

  • API提供元サーバーへの負荷
  • 自分のサーバーへの負荷
  • ユーザー閲覧時のレスポンスの遅さ

ZAPA先生API を利用する場合、データ取得のための通信コストとデータ解析のための処理コストがかかることになります。API によっては、1 秒間や1日間のAPI コール数を制限されていることもあります。また、アクセスの度にXMLを処理していては自分のサーバーへの負荷も高まってしまい、ユーザーも快適に利用できる状況とは言えなくなってしまいます。これらの問題を解決するために、一般的には「キャッシュ」の仕組みを利用しています。一度APIをコールして結果を生成したら、一定時間同じ結果を表示させることで、それぞれの負荷を減らして、快適なページ表示を実現させています。特に、最新の情報がそれほど必要にならないサービスにおいては、キャッシュ時間を長く設定することで、レスポンスを劇的に改善することが可能になります。

今回は、キャッシュの仕組みとしてPEARライブラリのCache_Lite(*1)を利用する手順を解説します。サーバーにCache_Liteがインストールされていない場合は、以下のコマンドを入力してサーバーにインストールして下さい。

# pear install Cache_Lite

サーバーにPEARライブラリをインストールできない場合は、PEAR公式サイトからダウンロードしてLite.phpをCacheディレクトリ内に配置して下さい。また、キャッシュファイルを保存する場所として、tmpディレクトリを作成し、書き込み権限を与えておいて下さい(例:777など)。このPEARライブラリには日本語のドキュメント(*2)も用意されていますので、利用方法がわからなかったり、もっと詳しい内容を知りたかったりする場合は、公式のドキュメントを確認して下さい。

Cache_Liteは以下の手順で、読み込み・設定・オブジェクト生成を行います。

//Cache_Liteインクルード
require_once "Cache/Lite.php";

//キャッシュオプション設定
$cacheOptions = array(
  'cacheDir' => './tmp/',  //tmpディレクトリに設定
  'lifeTime' => '3600',    //キャッシュを保持する時間を1時間に設定
);

//キャッシュID設定
$id = "area";

//Cache_Liteオブジェクト生成
$Cache_Lite = new Cache_Lite($cacheOptions);

キャッシュオプションのcacheDirにはキャッシュを保存するためのディレクトリ、lifeTimeにはキャッシュさせる時間を設定して下さい。データの更新が頻繁なAPIであればキャッシュ時間は短めに、あまり更新がないAPIであればキャッシュ時間は長めに設定すると良いでしょう。そして、Cache_Liteオブジェクトを生成し、識別子としてキャッシュIDを設定して、有効なキャッシュが存在するかどうかをチェックします。有効なキャッシュがある場合は、キャッシュをそのまま表示し、有効なキャッシュがない場合は、データを生成して表示した後、キャッシュに保存します。

if($data = $Cache_Lite->get($id)){
  //有効なキャッシュがある場合の処理
  //キャッシュデータを表示
  echo $data;
}else{
  //有効なキャッシュがない場合の処理
  //生成したデータを表示
  echo $data;
  //データをキャッシュ保存
  $Cache_Lite->save($data,$id);
}

----
*1):http://pear.php.net/package/Cache_Lite
*2):http://pear.php.net/manual/ja/package.caching.cache-lite.php

  • 1
  • 2

  



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)