2017-11-01 3 views
2

最近、私はプロジェクトを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(); 

私は、このローカルOpenServerIIS7IIS8サーバー上のコードや他の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

+0

IIS8.5&PHP 7.1.12と同じ – teran

答えて

0

、dubugging時に私はその問題がSplFixedArrayResultSet用途やunserialize()によって引き起こされたが見つかりました:


は素敵SplFixedArrayunserialize

ほらで何かがあるようです。

その後、私はthis topic: PHP 7.0.15 and PHP 7.1.0 ResultSet Caching #10111を見つけました。

は、私の場合は、PHP 7.0.247.1.55.6.305.5.38を使用しようとしました。そして5.5はうまくいった。

この問題はこのトピックのディスカッションで修正されたので、からResultSet::serializeunserializeのメソッドをコピーしました。そのトリックは、SplFixedArrayではなく、通常の配列としてデータをシリアル化することでした。

\Cake\ORM\ResultSet

313:  public function serialize() 
314:  { 
315:   if (!$this->_useBuffering) { 
316:    $msg = 'You cannot serialize an un-buffered ResultSet. Use Query::bufferResults() to get a buffered ResultSet.'; 
317:    throw new Exception($msg); 
318:   } 
319: 
320:   while ($this->valid()) { 
321:    $this->next(); 
322:   } 
323: 
324:   if ($this->_results instanceof SplFixedArray) { 
325:    return serialize($this->_results->toArray()); 
326:   } 
327: 
328:   return serialize($this->_results); 
329:  } 
330: 

339:  public function unserialize($serialized) 
340:  { 
341:   $results = (array)(unserialize($serialized) ?: []); 
342:   $this->_results = SplFixedArray::fromArray($results); 
343:   $this->_useBuffering = true; 
344:   $this->_count = $this->_results->count(); 
345:  } 
関連する問題