使用服务器端事件[通过phpfastcache]缺少缓存项
我正在使用服务器发送的事件为用户打印消息 在无限循环中,每10秒我检查缓存中是否有任何新项要广播:使用服务器端事件[通过phpfastcache]缺少缓存项,php,caching,phpfastcache,Php,Caching,Phpfastcache,我正在使用服务器发送的事件为用户打印消息 在无限循环中,每10秒我检查缓存中是否有任何新项要广播: $messages_to_broadcast = $this->_cache->getItemsByTag('inbox_message'); foreach ($messages_to_broadcast as $key => $_message) { $_message = $_message->get(); if($_message->recip
$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
方法吗?
我正在使用文件
作为缓存方法
\phpFastCache\CacheManager::setDefaultConfig(array(
"path" => DIR_TMP
));
global $cache;
$cache = \phpFastCache\CacheManager::getInstance('files');
你问这个问题已经有一段时间了,但是通常你只能通过标签抓取缓存中的项目,没有看到一个方法可以让你获取所有缓存条目
$entries=$cache->getItemsByTag('inbox\u message')
$entries
现在将保存您的所有项目
请看这里:
在这里,您可以看到一个完整的使用示例。您问这个问题已经有一段时间了,但通常您只能通过标记获取缓存中的项目,还没有看到一个方法可以让您获取所有缓存项
$entries=$cache->getItemsByTag('inbox\u message')
$entries
现在将保存您的所有项目
请看这里:
在循环中,您必须使用PhpFastCache的
detachItem
方法强制获取正确的值
这里有一个例子:
while (1) {
$cache = $this->cacheService->getCache();
if (null !== $cache) {
try {
$item = $cache->getItem('my_key');
if ($item->isHit()) {
echo "event: message\ndata: $item->get()\n\n";
}
$cache->detachItem($item);
} catch (InvalidArgumentException | PhpfastcacheInvalidArgumentException $e) {
$this->logger->error(
'There has been an error when getting cache item: '
.$e->getMessage().' - '.$e->getFile().' - '.$e->getLine()
);
}
}
ob_flush();
flush();
if (connection_aborted()) {
break;
}
sleep(1);
}
我在这里打开了一个问题来询问更多文档:在循环中,您必须使用PhpFastCache的
detachItem
方法强制它获得正确的值
这里有一个例子:
while (1) {
$cache = $this->cacheService->getCache();
if (null !== $cache) {
try {
$item = $cache->getItem('my_key');
if ($item->isHit()) {
echo "event: message\ndata: $item->get()\n\n";
}
$cache->detachItem($item);
} catch (InvalidArgumentException | PhpfastcacheInvalidArgumentException $e) {
$this->logger->error(
'There has been an error when getting cache item: '
.$e->getMessage().' - '.$e->getFile().' - '.$e->getLine()
);
}
}
ob_flush();
flush();
if (connection_aborted()) {
break;
}
sleep(1);
}
我在这里打开一个问题询问更多文档:Phpfastcache正在缓存后端对象中静态存储缓存项(确切的定义是“缓存”)。因此,您需要使用detachItem()
方法或clear()
清空缓存来释放对象
如上所述,我将很快更新Wiki,以澄清永久CLI脚本的行为。Phpfastcache正在缓存后端对象中静态存储缓存项(确切的定义是“缓存”)。因此,您需要使用detachItem()
方法或clear()
清空缓存来释放对象
如上所述,我将很快更新Wiki,以澄清永久CLI脚本的行为。这可能是问题解决方案。尽管我遇到这个问题的项目早就夭折了这可能是问题解决者。尽管我遇到这个问题的项目早就夭折了D