使用服务器端事件[通过phpfastcache]缺少缓存项

使用服务器端事件[通过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

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

在无限循环中,每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
方法吗? 我正在使用
文件
作为缓存方法

\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