cakephp 蛋糕PHP 3.4:如何缓存虚拟字段

55ooxyrt  于 2023-02-12  发布在  PHP
关注(0)|答案(2)|浏览(182)

有没有办法缓存虚字段?我是说自动地,用它们所属的实体,因为我知道,即使从缓存中检索到实体,虚字段也会在需要时生成。
显然我知道我可以亲自处理,所以(例子):

protected function _getFullName()
{
    $fullName = Cache::read('full_name_for_' . $this->_properties['id'], 'users');

    if (empty($fullName)) {
        $fullName = $this->_properties['first_name'] . '  ' . $this->_properties['last_name'];

        Cache::write('full_name_for_' . $this->_properties['id'], $fullName, 'users');
    }

    return $fullName;
}

但是我想知道CakePHP是否可以直接完成。
编辑
背景。
Post实体具有text属性。text可以包含图像(作为html代码),甚至是远程的。现在我必须将文本中包含的第一个图像的url及其大小存储在某个地方。因此我创建了first_image虚拟字段,它使用正则表达式。问题在于图像大小:我不能做到每次都运行getimagesize()函数,特别是如果是远程映像,原因大家很容易理解。那么怎么办呢?

b4lqfgs4

b4lqfgs41#

有没有办法缓存虚字段?
没有。
您所做的事情没有多大意义,在这种情况下,缓存肯定会导致比您从中获得的任何东西更多的开销。
在DB级别使用concat()来连接名称。
此外,如果真实的的需要缓存虚拟财产,那么我会说体系结构中明显出了问题。

wr98u20j

wr98u20j2#

对于我来说,希望防止访问器/虚字段中的代码在同一个请求中执行多次是有意义的,如果在脚本中的多个位置使用它们,则很容易发生这种情况。
你可以这样做,但我不完全确定它是否符合犹太教规:

private $fullName_cache = false;

protected function _getFullName()
{
if(!$this->fullName_cache){
    $fullName = Cache::read('full_name_for_' . $this->_properties['id'], 'users');

    if (empty($fullName)) {
        $fullName = $this->_properties['first_name'] . '  ' . $this->_properties['last_name'];

        Cache::write('full_name_for_' . $this->_properties['id'], $fullName, 'users');
    }

    $this->fullName_cache = $fullName;
}
return $this->fullName_cache;
}

我想可能有更好的方法来做这件事。食谱中有提到这类事情:
每次引用字段时,都会执行访问器中的代码。如果在访问器中执行资源密集型操作,则可以使用局部变量来缓存代码,如下所示:$我的实体属性= $实体-〉我的属性。
有人有幸实现了这个吗?

相关问题