Отсутствующие элементы кэша [через phpfastcache] с использованием событий на стороне сервера

Я использую Server-Sent Events, чтобы печатать сообщения для пользователя.

В бесконечном цикле каждые 10 секунд я проверяю, есть ли в кэше какой-либо новый элемент для трансляции:

$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);
}
}
}

С нерегулярными интервалами происходит событие, которое сохраняет сообщение в кеше:

$_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);
}

Проблема в том, что, хотя я проверяю в бесконечном цикле новые элементы в кэше, я получаю пустой массив. Когда я перезагружаю страницу или браузер повторно подключается к потоку событий на стороне сервера, элемент появляется в кеше. Есть ли 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
где вы можете увидеть полный пример использования.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]