質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.77%

【CakePHP3】キャッシュした結果をreadすると空が返ってくる

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,163

smnsmn

score 172

ページネーションの結果をキャッシュさせたいです。
下記のようにキャッシュが存在すればそれを使用、なければ新しく書き込みをしています。
1回目の実行で確かに書き込まれ、キャッシュファイルが作成されています。
中身もちゃんとデータが記述されていました。
ですが、2回目の実行でCache::read($cache_key, '30minute')した後の返り値が空です。
なぜ空になってしまうのでしょうか。

ページネーションを使った時のキャッシュの仕方がいまいちわからず困っています。
ご教授いただけますと幸いです。

// ページネーションの設定
public $paginate = [
    'limit' => 40
];

------------------------------------------------------------------------------------------
// 以下index()アクション内

// キャッシュキー設定
$cache_key = '';

// 固定の条件
$query = $this->Posts->find()
    ->where(['id IN' => [1, 3, 5, 7]]);

// キャッシュキーとページネーションの設定にページ数設定
if (!empty($this->request->query['page'])) {
    $cache_key .= 'page' . $this->request->query['page'];
    $this->paginate['page'] = $this->request->query['page'];
}

// 他にも色々な条件設定し、$cache_keyに追記していっています
if (!empty($this->request->query['sort'])) {
    $cache_key .= 'sort' . $this->request->query['sort'];
    $query->where(['id' => 'DESC']);
}

// キャッシュの読み込み
$data = Cache::read($cache_key, '30minute');

// キャッシュが無ければ新しく書き込み
if ($data === false) {
    $data = $this->paginate($query);
    Cache::write($cache_key, $data, '30minute');
}

// ビューへセット
$this->set(compact('data'));
// この時のCache::read($cache_key, '30minute')の返り値

object(Cake\ORM\ResultSet) {
    'items' => []
}


キャッシュファイルにはjson形式?でデータの配列が記述されている状態です。

追記
上記のように、readしたらからですが、キャッシュファイルには下記のようにクエリの結果が記述されています。
ですが、readすると空になってしまいます。

ページネーションを使ったキャッシュの場合このようになり、普通にfindした結果のキャッシュは読み出すことができます。

"Cake\ORM\ResultSet":313912:{O:13:"SplFixedArray":40:{i:0;O:15:"Cake\ORM\Entity":11:{s:14:"^@*^@_properties";a:18:{s:2:"id";i:355470;s・・・・・
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

とりあえず30minuteの記述が謎ですね。
30分だけキャッシュしたいということなのかもしれませんが、そういう設定方法ではないと思います。
マニュアルを見れば全部やり方が載っているので解決すると思います。

https://book.cakephp.org/3.0/ja/core-libraries/caching.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/14 17:33

    大変間が空いてしまいました。
    ご回答ありがとうございます。

    >>とりあえず30minuteの記述が謎ですね。
    下記部分の30minuteはapp.phpに設定した自分のオリジナルのキャッシュの設定の名前です。
    省略した場合は、defaultが使われるかと思います。
    Cache::read($cache_key, '30minute');
    Cache::write($cache_key, $data, '30minute');

    30minuteを入れない場合でも、結果は同じで、書き込んだキャッシュをreadすると、
    空の状態で返ってきてしまいます。

    生成されたcakephp/tmp/cache/以下のキャッシュファイルを確認すると、
    確かに実行したSQLの結果が書き込まれています。
    読み込みがうまくいかないようなのです。

    何か、お分かりになることがありましたら、ご教授頂けますと幸いです。

    キャンセル

  • 2018/03/14 17:35

    30minuteは下記リファレンスの
    $configに当たる引数です。何かおかしい点がありましたら教えて頂きたいです。
    書き方が何かまずいのでしょうか・・・・全く解決できず困っています。
    Cake\Cache\Cache::read($key, $config = 'default')

    https://book.cakephp.org/3.0/ja/core-libraries/caching.html#id7

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る