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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

1回答

636閲覧

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

smnsmn

総合スコア175

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2018/01/30 07:35

編集2022/01/12 10:55

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

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

PHP

1// ページネーションの設定 2public $paginate = [ 3 'limit' => 40 4]; 5 6------------------------------------------------------------------------------------------ 7// 以下index()アクション内 8 9// キャッシュキー設定 10$cache_key = ''; 11 12// 固定の条件 13$query = $this->Posts->find() 14 ->where(['id IN' => [1, 3, 5, 7]]); 15 16// キャッシュキーとページネーションの設定にページ数設定 17if (!empty($this->request->query['page'])) { 18 $cache_key .= 'page' . $this->request->query['page']; 19 $this->paginate['page'] = $this->request->query['page']; 20} 21 22// 他にも色々な条件設定し、$cache_keyに追記していっています 23if (!empty($this->request->query['sort'])) { 24 $cache_key .= 'sort' . $this->request->query['sort']; 25 $query->where(['id' => 'DESC']); 26} 27 28// キャッシュの読み込み 29$data = Cache::read($cache_key, '30minute'); 30 31// キャッシュが無ければ新しく書き込み 32if ($data === false) { 33 $data = $this->paginate($query); 34 Cache::write($cache_key, $data, '30minute'); 35} 36 37// ビューへセット 38$this->set(compact('data'));

php

1// この時のCache::read($cache_key, '30minute')の返り値 2 3object(Cake\ORM\ResultSet) { 4 'items' => [] 5}

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

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

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

json

1"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・・・・・

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

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

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

投稿2018/02/01 10:29

dala00

総合スコア441

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

smnsmn

2018/03/14 08:33

大変間が空いてしまいました。 ご回答ありがとうございます。 >>とりあえず30minuteの記述が謎ですね。 下記部分の30minuteはapp.phpに設定した自分のオリジナルのキャッシュの設定の名前です。 省略した場合は、defaultが使われるかと思います。 Cache::read($cache_key, '30minute'); Cache::write($cache_key, $data, '30minute'); 30minuteを入れない場合でも、結果は同じで、書き込んだキャッシュをreadすると、 空の状態で返ってきてしまいます。 生成されたcakephp/tmp/cache/以下のキャッシュファイルを確認すると、 確かに実行したSQLの結果が書き込まれています。 読み込みがうまくいかないようなのです。 何か、お分かりになることがありましたら、ご教授頂けますと幸いです。
smnsmn

2018/03/14 08:35

30minuteは下記リファレンスの $configに当たる引数です。何かおかしい点がありましたら教えて頂きたいです。 書き方が何かまずいのでしょうか・・・・全く解決できず困っています。 Cake\Cache\Cache::read($key, $config = 'default') https://book.cakephp.org/3.0/ja/core-libraries/caching.html#id7
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問