首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用服务器端事件[通过phpfastcache缓存]丢失缓存项

使用服务器端事件[通过phpfastcache缓存]丢失缓存项
EN

Stack Overflow用户
提问于 2017-09-06 19:32:56
回答 3查看 450关注 0票数 0

我正在使用服务器发送的事件,为用户打印消息。

在无限循环中,我每隔10秒检查一次缓存中是否有新的项目要广播:

代码语言:javascript
复制
$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);
        }
    }
}

每隔一段时间,就会发生事件,将消息保存到缓存中:

代码语言:javascript
复制
$_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作为缓存方法。

代码语言:javascript
复制
\phpFastCache\CacheManager::setDefaultConfig(array(
    "path" => DIR_TMP
));
global $cache;
$cache = \phpFastCache\CacheManager::getInstance('files');
EN

回答 3

Stack Overflow用户

发布于 2019-04-30 20:38:38

在循环中,您必须使用PhpFastCache的detachItem方法来强制它获得正确的值。

下面是一个示例:

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2019-04-30 23:39:40

Phpfastcache在缓存后端对象中静态地存储缓存项(确切的定义实际上是“缓存”)。因此,实际上,您需要使用detachItem()方法或clear()释放对象以清空缓存。

正如this issue上所描述的,我将很快更新维基,以澄清永久CLI脚本的行为。

票数 1
EN

Stack Overflow用户

发布于 2017-12-20 04:46:34

你已经问了一段时间了,但是通常你只能通过标签来获取缓存中的项目,还没有看到让你获得所有缓存条目的方法。

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

$entries现在将保存您的所有项目。

看看这里:https://github.com/PHPSocialNetwork/phpfastcache/blob/final/docs/examples/tagsMethods.php,你可以在这里看到一个完整的用法示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46074121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档