2017-09-06 16 views
0

私は、サーバー送信イベントを使用して、ユーザー用のメッセージを印刷しています。サーバーサイドイベントを使用して[phpfastcache経由でキャッシュアイテムが見つかりません]

$_cache_this = self::$_cache->getItem("message_".$_message->id); 
if(!$_cache_this->isHit()){ 
    $_cache_this->set($_message) 
     ->expiresAfter(600) 
     ->addTag('inbox_message'); 
    self::$_cache->save($_cache_this); 
} 
:キャッシュにメッセージを保存するイベントがあり、不規則な間隔で

$messages_to_broadcast = $this->_cache->getItemsByTag('inbox_message'); 
foreach ($messages_to_broadcast as $key => $_message) { 
    $_message = $_message->get(); 
    if($_message->recipient == $this->_user_id || $_message->recipient == 0){ 
     if(!is_null($html = \CRM\Engine\MessagingService::getMessageToBroadcast($_message))) 
     { 
      echo "event: $_message->type \n"; 
      echo "data:{\n"; 
      echo "data:\"message_html\": \"$html\" \n"; 
      echo "data:}\n\n"; 
      $this->send_keepalive = false; 
      $this->_cache->deleteItem($key); 
     } 
    } 
} 

、:無限ループで

、私は放送するキャッシュ内の新しい項目があるかどうかを確認、10秒ごと

問題は、キャッシュ内の新しい項目に対して無限ループをチェックインしている間に、空の配列を取得することです。ページをリロードするか、ブラウザがサーバーサイドイベントストリームに再接続すると、アイテムがキャッシュに表示されます。 flushメソッドがありますか? キャッシュメソッドとしてfilesを使用しています。

\phpFastCache\CacheManager::setDefaultConfig(array(
    "path" => DIR_TMP 
)); 
global $cache; 
$cache = \phpFastCache\CacheManager::getInstance('files'); 

答えて

0

それはあなたがこれを求めてきましたが、通常あなただけのタグによって、キャッシュ内のアイテムをつかむことができ、あなたはすべてのキャッシュエントリを取得してみましょうする方法を見ていない中です。

$entries = $cache->getItemsByTag('inbox_message')

$entriesは今、すべてのアイテムを保持します。

ここをクリックしてください: https://github.com/PHPSocialNetwork/phpfastcache/blob/final/docs/examples/tagsMethods.php ここでは、使用例の完全な例を見ることができます。

関連する問題