理论:PHP内部类方法缓存

时间:2015-03-13 09:00:51

标签: php caching

你好

考虑类方法,每次做一些代码准备,即实例新对象,创建数组或连接长字符串,如下所示:

class Example
{

    public function methodWithPreparations($timestamp)
    {
        // preparations
        $date = new DateTime();
        $format = implode('-', array('Y', 'm', 'd', 'h', 'i', 's'));
        $append = ' some text';
        $append .= OtherClass::someText(); // persisten during runtime

        // using function arguments
        return $date->setTimestamp($timestamp)->format($format).$append;
    }

}

为代码准备实现一些缓存机制是好的,还是现代PHP能够自己处理它?我使用PHP 5.6,但我从未深入研究过它的内部工作原理。

如何使用$cache属性如何:

class Example
{

    protected $cache;

    public function methodWithPreparations($timestamp)
    {
        if(empty($cache = &$this->cache('chacheKey'))) {
            $cache['dateTime'] = new DateTime();
            $cache['format'] = implode('-', array('Y', 'm', 'd', 'h', 'i', 's'));
            $cache['append'] = ' some text'.OtherClass::someText();
        }

        // and then
        return $cache['dateTime']->setTimestamp($timestamp)
                    ->format($cache['format']).$cache['append'];
    }

}

的想法是什么?

2 个答案:

答案 0 :(得分:1)

PHP不会为您缓存这些变量。在构造函数中将它们作为类变量创建,并在以后需要时重用它们。

public function __construct() {
    $this->dateTime = new DateTime();
    $this->dateFormat = implode('-', array('Y', 'm', 'd', 'h', 'i', 's'));
    $this->append = ' some text'.OtherClass::someText();
}

public function methodWithPreparations($timestamp) {
    return $this->dateTime->setTimestamp($timestamp)->format($this->dateFormat).$this->append;
}

您不需要重新创建DateTime,因为您可以重复使用它。您可以为不同的dateFormats创建一个缓存,如果不仅仅是时间戳更改,也会附加。

答案 1 :(得分:1)

您使用PHP - 因此您应该熟悉RFC 2616.您应该了解使用HTTP / 1.1实现的痛苦的复杂性,以及操作网站时缓存管理的问题。缓存函数的输出同样是一个复杂的提议,但PHP不会尝试实现任何机制来执行此操作。作为一种编程语言,它不需要。 (有趣的是,MySQL实现的过程语言的语义确实允许缓存,但它的实现非常非常有限。)

PHP不知道可以缓存一个值多长时间。它不知道使该缓存无效的条件。它无法使用生成数据项的代码维护数据项的关联。

这是你的工作。

出于完全相同的原因,我们无法确定您的方法是否有效。保存CPU周期(或数据库查询或网络数据包......)通常是一个好主意。但是,例如,上面的代码在对象持续存在的时间越来越长。如果它正在处理一个短暂的Web请求,这可能不是问题 - 但是如果您正在为核反应堆编写监控守护程序,那么您可能不希望将缓存用于绑定值(并且时间相关值应该具有TTL)。