ホリデープログラミング入門

ホリデーにプログラミングを楽しむための入門 by 船木信宏

全体表示

[ リスト ]


取得した内容をキャッシュする、Cache_Lite導入


実際に使うときは、RSSやAPIのURLを対象にすることが多いでしょう。アクセスのたびにそれらからfile_get_contentsで中身を取得していると、

・重い(取得に時間がかかる)
・相手のサーバに負荷をかける場合がある

ので「キャッシュ」を使うのがベターです。キャッシュの仕組みはPHPの標準ライブラリであるPEARのCache_Liteを使います。


PEAR :: Manual :: はじめに
上記ページによるとPEARの読みはペアが正しいようですが、ピアと呼んでいる方もいます。

PHPの公式サイトと同じような作りなので右上の「Search for テキストボックス」にcache_liteで検索すれば出てきます。

PEARのライブラリはPHPのプログラムなので、普通のファイルで構成されています。導入しやすいようにコマンドラインから入れることもできますが、ここでは直接ダウンロードしてみます。

現時点では1.7.2が最新です。tgzという圧縮形式ですので解凍には何かしらソフトが必要です。自分はeoを使っています。

解凍するとCache_Lite-1.7.2というフォルダができていろいろ入っていますが、使うのは

・Lite.php
・Lite/ フォルダの中身

だけです。docsとかtestsフォルダの中身は違うな、というのは経験的にわかるようになると思います。上記ファイルをCacheというフォルダに入れて、実際使いたいプログラムのあるフォルダにコピーします。

Cache_Liteの簡単な使い方


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

// 設定項目
$cacheOptions = array (
'cacheDir' => '/tmp/', // キャッシュが保存される場所
'lifeTime' => 3600, // 指定した秒数はキャッシュを使う、nullにすると無期限
);

$url = 'http://www.yahoo.co.jp/';
$cacheId = $url;

$objCache = new Cache_Lite($cacheOptions);

if ($cache = $objCache->get($cacheId)) {
$buf = $cache; // キャッシュが見つかったときはここで代入
} else {
// キャッシュがなかったとき、lifeTimeより古くなっているときはここで処理
$buf = mb_convert_encoding(file_get_contents($url), 'UTF-8', 'auto');
$objCache->save($buf, $cacheId); // キャッシュとして保存
}
echo $buf;

ちょっと長くなりましたがこれが基本形です。非常によく使うので、僕はこのプログラムをいつでもコピーしやすい場所に書いてあります。

キャッシュが保存される場所のパーミッションは(多くの場合)777である必要があります。パーミッションも多少ややこしい仕組みですが、検索エンジンで調べてみてください。

このCache_Liteを使うと、2回目のアクセスから、取得したYahoo!の中身をファイルに保存したキャッシュから取り出すので表示が速くなります。

外部のサーバに無意味なアクセスを大量に送り込むのはお行儀が悪いのでキャッシュの仕組みは必須と言えます。

HTTPヘッダーを追加する


ちょっとアドバンスなfile_get_contentsの使い方。僕も最近知りました。

<?php
$context = array('http' => array('header' => "Accept: text/xml,application/xml,application/xhtml+xml,text/html\\r\\nUser-Agent: zuzara"));
$xcontext = stream_context_create($context);
echo file_get_contents(適当なURL, false, $xcontext);

PHP5から3番目の引数にHTTPのヘッダーを指定できるようになったようです。上記のようにすれば画像や動画のURLを指定しても取得しないようになります。(サーバによってはダメですが)

PHP Warning: file_get_contents(画像のURL): failed to open stream: HTTP request failed! HTTP/1.1 406 No acceptable objects were found in /home/funaki/work/test.php on line 19

If-Modified-Sinceなども指定できるので便利になりました。


次回は

さてさて次回は実際にAPIを使ってマッシュアップらしきことを実践してみたいと思います。

閉じる コメント(0)

コメント投稿

顔アイコン

顔アイコン・表示画像の選択

名前パスワードブログ
絵文字
×
  • オリジナル
  • SoftBank1
  • SoftBank2
  • SoftBank3
  • SoftBank4
  • docomo1
  • docomo2
  • au1
  • au2
  • au3
  • au4
投稿

開く トラックバック(3)


.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事