最近、私はプロジェクトをWebホスティングに移しました(CentOS
,両方を試してみました)OpCache
が有効で、クエリ結果キャッシュが機能しないことがわかりました。CakePHPクエリ結果キャッシュ
ナビゲーションメニューにデフォルトのファイルキャッシュエンジンを使用します。
$mt = TableRegistry::get('MenuItems');
$menu = $mt->find('active')
->select([
"MenuItems.id",'Nodes.id','title', 'header', 'route', 'link',
'parent_id' => 'Nodes.parent_id' ])
->orderAsc('Nodes.num')
->cache("sitemenu_MenuItems", 'long')
->hydrate(false)
->toArray();
私は、このローカルOpenServer
、IIS7
とIIS8
サーバー上のコードや他のLinux
サーバーに問題がありませんでした。
ので、何が起こっている:私は最初にスクリプトを実行すると
は、ケーキは、DBからデータを取得し、/src/tmp/cache/long/cake_sitemenu__menu_items
にキャッシュを書き込みます。 Fileは通常どおりコンテンツをシリアライズしています。
しかし、ページをリフレッシュすると空の結果が表示されます。
エラーまたはデバッグログに何もありません。
私はキャッシュキーを小文字にしようとしましたが、運がありません。
アイデア?
私は基本的なキャッシュ自体を確認するためにテストコードを追加しました:
public function qwe(){
$data = ['key' => 'value'];
//Cache::write('test', $data, 'long');
$result = Cache::read('test', 'long');
$result[] = 'xxx';
$this->setJsonResponse($result);
}
と、このコードは、正しい結果を返します。
は、これまでのところ、私はCake\Cache\Egine\FileEngine
クラスのいくつかの問題read()
方法があることがわかりました。ライン223:
$data = unserialize((string)$data);
$data
は、ホスティングおよびローカルマシン上の呼び出し前に、同じ値を持っています。 unserialize
は、空のitems
フィールドを持つResultSet
オブジェクトを返します。あなたが見ることができるようにPHP 7.0.15 and PHP 7.1.0 ResultSet Caching #10111
IIS8.5&PHP 7.1.12と同じ – teran