2015-03-13 43 views
0

你好理論:類方法中PHP緩存

考慮類方法,即每次做一些代碼的準備,即例如新的對象,創建數組或連接長字符串,像這樣:

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']; 
    } 

} 

什麼覺得呢?

+0

不要生成類存在的值是個好主意。 – Zaki 2015-03-13 09:06:08

+0

@Zaki:當然。我的問題是關於方法特定的值。 – Vaclav 2015-03-13 11:02:19

回答

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創建一個緩存並附加不僅時間戳更改。

+0

如果變量是關鍵的並且跨類共享,我將它定義在構造函數中,但是對於特定於方法的變量,在方法中創建和緩存變量ad-hoc更加高效,而且它也是更簡潔的代碼,因爲變量和方法是定義的在一個地方。我還嘗試實現更多功能性代碼 - 不是在構造函數中定義所有內容 - 僅僅是基本的東西 - 並通過智能方法提供其餘部分。 – Vaclav 2015-03-13 10:57:06

1

您使用PHP--因此您應該對RFC 2616有一定的瞭解。您應該瞭解使用HTTP/1.1實現的複雜疼痛以及操作網站時緩存管理的問題。緩存一個函數的輸出並不是一個複雜的提議,但PHP並不試圖實現任何機制。作爲編程語言,它不需要。 (有趣的是,由MySQL實現的過程語言的語義確實明確允許緩存,但它的實現非常非常有限)。

PHP不知道值可以被緩存多長時間。它不知道會使緩存無效的條件。它沒有辦法維護與生成它的代碼的數據項的分離。

這是你的工作。

由於完全相同的原因,我們不能說您的方法是否有效。保存CPU週期(或數據庫查詢或網絡數據包...)通常是一個好主意。但是,例如,上面的代碼在對象持續存在的時間越長的情況下越是破碎。如果它正在處理短暫的Web請求,那麼這可能不成問題 - 但是如果您正在爲核反應堆編寫監視守護程序,那麼您可能不想使用緩存來計算tie值(並且時間相關的值應該具有TTL)。

+0

謝謝你的回覆。我對RFC 2616有一點了解,但它是一種文本,當我看到它時通常會出現蕁麻疹。我也注意到,[RFC 2616已經死了](https://www.mnot.net/blog/2014/06/07/rfc2616_is_dead),而且還有RCF 723 [0-5],我會推我自己有時會閱讀它。 – Vaclav 2015-03-13 10:41:47

+0

我所做的一點是cachng很困難,需要大量元數據 - 而不是你應該使用HTTP/1.1緩存PHP中的返回值。對不起,如果這不明確。 – symcbean 2015-03-13 11:58:20

+0

沒問題。你的回答很好解釋。我只想表達我對RFC2616的看法。 – Vaclav 2015-03-13 12:15:42