Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 混凝土5(5.7)-Don和#x27;t缓存页或当前块对块错误_Php_Concrete5_Concrete5 5.7_Concrete - Fatal编程技术网

Php 混凝土5(5.7)-Don和#x27;t缓存页或当前块对块错误

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

我有一个块,它依赖于一个相当脆弱的第三方服务来获取要呈现的数据,因此,当它确实遇到问题时,我希望显示一条错误消息,而不是抛出异常而不呈现页面

在您使用块/页缓存之前,操作非常简单。数据的生命周期很长,因此,当找到数据时,可以缓存所有数据。但是,如果不是这样,则会缓存页面,并将错误消息放在适当的位置。因此,我需要告诉CMS不要将块或页面输出保存到缓存中

示例代码(块控制器内):


在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对象会有所帮助,等我有时间的时候,我还得玩一玩。