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

かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

PHP Cache_Lite 保存するときはテキスト化する。

PHPでCache_Liteでキャッシュを保存していた時にキャッシュ自体は保存できているのに、Cache_Lite->getしてもfalseになりキャッシュが上手く機能しなくてハマッたメモ。

Twitterからタイムラインを取得して返すAPIを作っていました。

<?php
require_once(__DIR__ . '/lib/config.php'); // Twitter APIのキーとかが入ってるファイル
require_once(__DIR__ . '/lib/twitteroauth/autoload.php');
require_once(__DIR__ . '/lib/cache/Lite.php');
use Abraham\TwitterOAuth\TwitterOAuth;

$cache_id = 'id_tw';
$cache_group = 'twitter';
$options = array(
  'cacheDir' => __DIR__ . '/app/tmp/',
  'lifeTime' => 180,
);
$cache = new Cache_Lite($options);
if( $data = $cache->get($cache_id, $cache_group) ) {
  // キャッシュがアレばそれを使う
} else {
  $data = array();
  $twObj = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
  $res = $twObj->get("statuses/user_timeline", array(
    'screen_name' => TWITTER_USER,
    'count' => "10"
  ));
  if($res) {
    foreach($res as $key => $post) {
      $d = array();
      // $postデータから必要なものを取り出して整形
      $d['id'] = $post->id;
      $d['text'] = $post->text;
      // ...
      $data[] = $d;
    }
    $cache->save($data, $cache_id, $cache_group);
  }
}
header("Content-Type: application/json; charset=utf-8");
echo json_encode($data);
exit();
?>

Twitterからデータは取得でき、キャッシュファイルも作られてるのにif( $data = $cache->get($cache_id, $cache_group) )が常にfalseでキャッシュから読み込まれていない状態になっていました。そこでキャッシュファイルの中身を確認したら........... 0 みたいな感じでどうやら保存そのものに問題があったようです。

saveするデータが配列のままだったのが問題

キャッシュを保存している

$cache->save($data, $cache_id, $cache_group);

の部分の$dataが配列のままだったのがよろしくないようでした。
キャッシュを保存している部分を修正します。

<?php
// {略}
    // json形式に変換してキャッシュに保存
    $data = json_encode($data);
    $cache->save($data, $cache_id, $cache_group);
  }
}
header("Content-Type: application/json; charset=utf-8");
// 既にjson形式に変換されているのでこっちではエンコードしない
echo $data;
exit();
?>

これで上手くキャッシュから読み込まれるようになりました!
今どきCache_Lite感があるのでPHPに導入された方のキャッシュを勉強しなければと思いつつ...


[Twitter取得関係のメモ]