Php 混凝土5(5.7)-Don和#x27;t缓存页或当前块对块错误
我有一个块,它依赖于一个相当脆弱的第三方服务来获取要呈现的数据,因此,当它确实遇到问题时,我希望显示一条错误消息,而不是抛出异常而不呈现页面 在您使用块/页缓存之前,操作非常简单。数据的生命周期很长,因此,当找到数据时,可以缓存所有数据。但是,如果不是这样,则会缓存页面,并将错误消息放在适当的位置。因此,我需要告诉CMS不要将块或页面输出保存到缓存中 示例代码(块控制器内):Php 混凝土5(5.7)-Don和#x27;t缓存页或当前块对块错误,php,concrete5,concrete5-5.7,concrete,Php,Concrete5,Concrete5 5.7,Concrete,我有一个块,它依赖于一个相当脆弱的第三方服务来获取要呈现的数据,因此,当它确实遇到问题时,我希望显示一条错误消息,而不是抛出异常而不呈现页面 在您使用块/页缓存之前,操作非常简单。数据的生命周期很长,因此,当找到数据时,可以缓存所有数据。但是,如果不是这样,则会缓存页面,并将错误消息放在适当的位置。因此,我需要告诉CMS不要将块或页面输出保存到缓存中 示例代码(块控制器内): 在catch块中,我尝试了$this->btCacheBlockOutput=true和\Cache::disableA
在catch块中,我尝试了
$this->btCacheBlockOutput=true
和\Cache::disableAll()代码>但两者都不起作用。有没有办法告诉C5不要缓存当前请求中的任何内容?混凝土文件夹中的BlockController将这些受保护变量设置为标准:
protected $btCacheBlockRecord = true;
protected $btCacheBlockOutput = false;
protected $btCacheBlockOutputOnPost = false;
protected $btCacheBlockOutputForRegisteredUsers = false;
因此,如果您在block controller.php上将所有这些设置为false,则它不应该缓存您的块
class Controller extends BlockController
{
protected $btCacheBlockRecord = false;
protected $btCacheBlockOutput = false;
protected $btCacheBlockOutputOnPost = false;
protected $btCacheBlockOutputForRegisteredUsers = false;
public function view(){
.....
这将禁用块的缓存(即使第三方连接成功)
另一种解决方案是将从第三方接收的数据保存在数据库中(例如,作为json字符串),并在第三方连接失败时从数据库加载数据。。。如果第三方连接成功,则可以更新数据库中的记录
根据第三方服务的答案,您可以设置条件。
例如:
(以上代码尚未测试)
有关存储配置值的详细信息:
*编辑*
第三个选项是在调用失败时清除该特定页面的缓存
在blockcontroller的顶部:
use \Concrete\Core\Cache\Page\PageCache;
use Page;
在调用API失败时的“if”中:
$currentPage = Page::getCurrentPage();
$cache = PageCache::getLibrary();
$cache->purge($currentPage);
位于:混凝土文件夹中的BlockController将这些受保护变量设置为标准:
protected $btCacheBlockRecord = true;
protected $btCacheBlockOutput = false;
protected $btCacheBlockOutputOnPost = false;
protected $btCacheBlockOutputForRegisteredUsers = false;
因此,如果您在block controller.php上将所有这些设置为false,则它不应该缓存您的块
class Controller extends BlockController
{
protected $btCacheBlockRecord = false;
protected $btCacheBlockOutput = false;
protected $btCacheBlockOutputOnPost = false;
protected $btCacheBlockOutputForRegisteredUsers = false;
public function view(){
.....
这将禁用块的缓存(即使第三方连接成功)
另一种解决方案是将从第三方接收的数据保存在数据库中(例如,作为json字符串),并在第三方连接失败时从数据库加载数据。。。如果第三方连接成功,则可以更新数据库中的记录
根据第三方服务的答案,您可以设置条件。
例如:
(以上代码尚未测试)
有关存储配置值的详细信息:
*编辑*
第三个选项是在调用失败时清除该特定页面的缓存
在blockcontroller的顶部:
use \Concrete\Core\Cache\Page\PageCache;
use Page;
在调用API失败时的“if”中:
$currentPage = Page::getCurrentPage();
$cache = PageCache::getLibrary();
$cache->purge($currentPage);
可在以下网址找到:谢谢,但这并不能回答问题。该块用于高流量页面,在这些页面上确实需要整页缓存。我已经将数据保存在“昂贵”(磁盘)缓存中,这非常适合,但无助于解决页面缓存问题。我已经编辑了我的响应,请参阅“第三个”选项。我已经测试了页面是否仍然加载,因此代码是有效的。如果像这样从缓存中清除页面会阻止当前呈现的输出被缓存,这是一个很好的开始,但是,通过快速测试,我仍然看到旧的块输出。这可能来自块输出缓存,在错误处理中调用相关块对象的refreshBlockOutputCache方法似乎没有帮助。也许此时手动填充块的cacheSettings对象会有所帮助,等我有时间的时候我还得玩一玩。谢谢,但这并不能回答问题。该块用于高流量页面,在这些页面上确实需要整页缓存。我已经将数据保存在“昂贵”(磁盘)缓存中,这非常适合,但无助于解决页面缓存问题。我已经编辑了我的响应,请参阅“第三个”选项。我已经测试了页面是否仍然加载,因此代码是有效的。如果像这样从缓存中清除页面会阻止当前呈现的输出被缓存,这是一个很好的开始,但是,通过快速测试,我仍然看到旧的块输出。这可能来自块输出缓存,在错误处理中调用相关块对象的refreshBlockOutputCache方法似乎没有帮助。也许在这一点上手动填充块的cacheSettings对象会有所帮助,等我有时间的时候,我还得玩一玩。