我正在使用服务器发送的事件,为用户打印消息。
在无限循环中,我每隔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');发布于 2019-04-30 20:38:38
在循环中,您必须使用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);
}我在这里打开一个问题来询问更多的文档:https://github.com/PHPSocialNetwork/phpfastcache/issues/687
发布于 2019-04-30 23:39:40
Phpfastcache在缓存后端对象中静态地存储缓存项(确切的定义实际上是“缓存”)。因此,实际上,您需要使用detachItem()方法或clear()释放对象以清空缓存。
正如this issue上所描述的,我将很快更新维基,以澄清永久CLI脚本的行为。
发布于 2017-12-20 04:46:34
你已经问了一段时间了,但是通常你只能通过标签来获取缓存中的项目,还没有看到让你获得所有缓存条目的方法。
$entries = $cache->getItemsByTag('inbox_message')
$entries现在将保存您的所有项目。
看看这里:https://github.com/PHPSocialNetwork/phpfastcache/blob/final/docs/examples/tagsMethods.php,你可以在这里看到一个完整的用法示例。
https://stackoverflow.com/questions/46074121
复制相似问题