PearのCache_Liteを使って、TwitterAPIから取得したXMLをキャッシュさせる@デザイナー

デザイナーでもPHP使いたい!シリーズ第二弾です。

第一弾はPHPとTwitterAPIを利用して、自分のタイムラインを表示してみる@デザイナーです。こちらを先に読んで頂くと、より分かりやすいかと思います。

今回は、第一弾で作成したTwitterのタイムラインを表示するプログラムを、APIを叩いてから1時間以内はキャッシュを利用して表示するやり方を書いていきます。

サンプルページ

twitterAPIって確か1時間に何回もリクエストすると規制されちゃったような。。。
なので1回取りに行ったら1時間以内は取りにいかないみたいな処理が必要かなと。
コメント欄@iskrさん

という指摘をコメント欄で頂きました。こういう指摘を頂けると公開する意味がありますね。

ただ、公開する際にはセキュリティについても合わせて考えてていかないといけないので、以下の記事を熟読する事をお勧めします。
正直良く分からない部分もありますが、意識するように心がけています。

では、また前置きが長くなってきたので本題に。

日本語で処理の流れを考える兼目次

まずは例のごとく、処理の流れを日本語で考えます。

今回は流れはシンプルです。

PearのCache_Liteを使用する

取得した情報のキャッシュはPearCache_Liteパッケージで実現出来そうです。

Pear(ピアー)とは

PEAR とは、PHP ユーザのためのオープンソースコードの構造化されたライブラリです。
要は、世界中のphpエキスパートの方々が、よく使われる再利用できそうなクラスをパッケージ化して配布しておられる感じです。
PEARについて

前々から名前は聞いた事がありましたが、使うのは初めてです。
エキスパートって響きだけで使いたくなりますねw

Cache_Liteのインストール

まずはCache_Liteをインストールします。

レンタルサーバーには既にインストールされているものもあるようなのですが、あまり良くわからないので勉強の為、自分でインストールします。


Pearの公式サイトからCache_LiteパッケージをDLしてきます。
Cache_Liteの日本語版マニュアルも公式サイトにありました。

なにやらコマンドを使って、インストール出来るようなのですが、その辺りは良く分からないので、直接サーバ上にファイルをアップする方法でやって見ました。
これはインストールというのだろうか。。今後の課題ですね。

それをサーバ上にアップして、使いたいファイルに以下の記述を追加して呼び出します。

// Cache_Liteのプログラムを読み込む
require_once 'Cache/Lite.php';

require_once関数で読み込みます。
これで、Cache_Liteの機能が使える様になりました。

続いて、キャッシュファイル保存用のディレクトリを作成します。
これは別にFTPでサーバ上に直接作成しても良いと思うのですが、勉強なのでPHPで作成してみます。
(実際にこういう初回のみで、以降使う機会が想定されないものはどうしてるんですかね。)

$dir = "/home/ユーザー名/caraldo.net/public_html/blog/sample/tmp";
if (!file_exists($dir)) {
	mkdir($dir, 0700); 
	echo "キャッシュ用のディレクトリを作成しました";//確認用
}

mkdir関数を使用して、ディレクトリを作成しました。
引数でパーミッションの指定が可能です。
読み書き出来るパーミッションを指定して下さい。

続いてCache_Liteの設定です。

// 設定項目
$cacheOptions = array (
'cacheDir' => './tmp/', // キャッシュが保存される場所
'lifeTime' => 3600, // 指定した秒数はキャッシュを使う、nullにすると無期限
);
$cacheId = $url;
//Cache_Liteオブジェクト生成
$objCache = new Cache_Lite($cacheOptions);

この部分は以下サイトを参考にさせて頂きました。
PHPで指折りに便利なfile_get_contents関数を使いこなす (後編) - ホリデープログラミング入門 - Yahoo!ブログ

他にも設定出来る項目は沢山ありますので、Cache_Liteの日本語版マニュアルを確認して下さい。


キャッシュが既に存在するかをチェックする

次はキャッシュがあるか無いかを判定して、あればキャッシュを呼び出す、無ければAPIを叩いてキャッシュを生成するという部分です。

if ($cache = $objCache->get($cacheId)) {

この記述で、キャッシュの有無を判定しています。
$objCache->get($cacheId)が空なら、$cacheにnullが代入されるのでifの判定はFALSEになるということです(よね?)

無ければAPIを叩きにいき、取得結果をキャッシュする

キャッシュが有る場合には$xmlStrに$cacheを代入し、無い場合はelse側に処理が流れ

} else {
// キャッシュがなかったとき、lifeTimeより古くなっているときはここで処理
$xmlStr = @file_get_contents($url);
 //キャッシュ保存
$objCache->save($xmlStr,$cacheId);

という記述で$xmlStrをキャッシュファイルに保存します。

この部分は以下サイトを参考にさせて頂きました。
simplexml_load_fileで取得したxmlオブジェクトがpearのCache_Liteでキャッシュできない ~ 解決策

@の意味は、エラーがあってもエラーメッセージを出力させないようにさせるためのものらしいです。
Side-B - PHP:式の前の@(アットマーク)

SimpleXMLオブジェクトはCache_Liteでキャッシュできない

当初は以下の様にsimplexml_load_file関数でオブジェクトに変換したものをキャッシュしようと思っていたのですが、うまく動きませんでした。

} else {
// キャッシュがなかったとき、lifeTimeより古くなっているときはここで処理
//だめな例
$xmlStr = simplexml_load_file($url);
//キャッシュ保存
$objCache->save($xmlStr,$cacheId);

どうやら

simplexml_load_fileでWebAPIのレスポンス値を取得したSimpleXMLオブジェクトはCache_Liteでキャッシュできないようです。
xmlオブジェクトがpearのCache_Liteでキャッシュできない ~ 解決策

という事のようです。

で、どうすれば良いのかって事で、上記サイトで解決策まで書かれています。
要約するとキャッシュする状態は、XMLを文字列として持っておくという事です。
そこでfile_get_contents関数が出てきた訳です。

関連
XenoPocket - SimpleXMLのシリアライズ
[PHP]simplexml_load_file、Pear Cache_Liteについての質問です。 一度取得したXMLをキャッシュとしてCache_Liteから利用したいのですが、取り込みがうまくできません。 $g.. - 人力検索はてな
これでかなりひっかかってしまいました。

XMLオブジェクトに変換

あとは、先ほどキャッシュもしくは、APIから取得したデータ($xmlStr)をsimplexml_load_string関数を使用してXMLオブジェクトに変換するだけです。

//simplexml_load_fileから取得の仕方に応じて変更
$rss = simplexml_load_string($xmlStr);

その後の処理は前回記事を参照して下さい。

完成したサンプルページ

総括

キャッシュする事によって、APIの制限に引っ掛からなくするだけでなく、API提供側にも余計な負荷をかけないで済むようになりました。
セキュリティ以外にも、負荷とか気にしてやっていこうと思います。

とりあえず、出来て良かった!

このエントリーのトラックバックURL:

コメント

はじめまして。
synapse28.comというブログをやってますtakasynaと申します。

phpとか全くの初心者でして、何か簡単なものを作りながら勉強しようと始めたばかりです。

その最初の勉強として、こちらのエントリと、
「PHPとTwitterAPIを利用して、自分のタイムラインを表示してみる@デザイナー」
を参考にさせていただきました。
(といいますか、ソースそのままほとんどパクリ状態なのですが、、、すみません)

勝手ながら私のブログのエントリで自分のメモ的に公開させて頂いておりまして、
参考にさせて頂いた記事としてリンクを貼らせて頂きました。

事後報告で失礼ではございますが、よろしくお願いいたします。

Posted by ; takasyna : 2010年5月27日 17:47

>takasynaさん

コメントありがとうございます、お役に立てたようで嬉しいです。
まだまだ勉強中なので変な点が多いと思いますが、一応動いていますw

頑張って色々書いていこうと思いますので、今後もお付き合い下さい。

よろしくお願いします。

Posted by ; caraldok : 2010年5月27日 18:25

(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)




太字 イタリック アンダーライン ハイパーリンク 引用

caraldo_K

Webディレクター的な事やってます!
iPhone楽しい!マラソン・ロードバイクで肉体改造計画中!でも一番好きなのは漫画です㌰㌰⋋( 'Θ')⋌㌰㌰

poooooon

最近Web屋になりました。iPhoneとねこが好きです。ロードバイクは好きと良く言いますが全然乗ってません。

Our tweets
Loading..

POWERED BY MT4