通過PHP靜態變量進行緩存
通過PHP靜態變量進行緩存s

通過PHP靜態變量進行緩存

當一段代碼裏在重複使用一個方法調用時,你也許會問如果把值本地緩存起來難道不會更有效率,這樣完全避免函數調用而提高處理速度。讓我來看看我們如何可能來使用緩存通過PHP的靜態變量。

函數調用是非常資源密集對的:PHP需要設置一個新的調用環境,導入(supper)全局變量,創建一些新的變量(參數),然後再完成的時候清理它們所有的東西。而且這對PHP的內建函數也是一樣的。避免它可以幫助每個人節約一些工作。

一些函數會總是返回相同的結果,如果傳給它相同的參數的話:這些就是那些可以緩存的。這個也是for循環如果喜劇性地加快速度的:

<?php
for($i = 0 ; $i < count($array) ; $i++) { /* Do something */ }
?>

這裏,count($array)將會總是返回相同的值。完全沒有必要每一次都去計算它,所以將它保存到本地變量將會加快很多循環的速度。

<?php
$count = count($array) ;

for($i = 0 ; $i < $nb ; $i++) { /* Do something */ }
?>

同樣這個也適用於任何類似情況代碼,甚至在循環的外面。

<?php
$store = new Store();

$store->in(dirname(__DIR__). DS. 'Catalog')

->in(dirname(__DIR__). DS. 'Source')

->in(dirname(__DIR__). DS. 'PrivateList')

->name('#\.php$#');
?>

這裏,’dirname( _DIR _) . DS’調用可以通過保存這個片段的結果在一個本地變量來避免。

<?php
$store = new Store();

$path = dirname(__DIR__). DS ;

$store->in($path. 'Catalog')

->in($path. DS. 'Source')

->in($path. 'PrivateList')

->name('#\.php$#');

?>

很容易能夠通過benchmark基準來顯示上面的改變實際上會使上面的代碼幾乎快2倍。而且,使用dirname()越多,得到的優化更多。

使用靜態變量

現在,讓我們來考慮一個非常好的PHP功能:靜態變量。這樣一個關鍵字,當對一個在函數內用到的變量使用時,會使該變量在反複函數調用之間繼續存在(請不要把這個和靜態的類成員混淆)。你可以把它比成像專門爲一個函數保留的全局變量。這是上面的代碼的一個更新版本:

<?php
$store = new Store();

static $path ;

if (!isset($path)) {

$path = dirname(__DIR__). DS ;

}

$store->in($path. 'Catalog')

->in($path. 'Source')

->in($path. 'PrivateList')

->name('#\.php$#');

一旦初始化,$path變量對每一次調用時都有效。這個給這個代碼帶來另外2被的速度提升!而且,就像前面的,更多dirname(…)更好。

能更快嗎?

剩下的下面兩個選擇來進一步提升代碼是用值hardcode或使它成爲一個常量。Hardcode永遠都是一個壞主意,而且在像例子中的代碼裏很難管理,因爲 _DIR _可能基於不同的部署安裝而不同。使用一個常量通常是一個提升速度方面的好主意,但在我們的例子中它有可能也遇到和hardcode一樣問題。我們將僅僅考慮這兩個不同的方案是作速度提升的其他選擇。記得,代碼是這樣的:

<?php

$store = new Store();

$store->in(PATH. 'Catalog')

->in(PATH. DS. 'Source')

->in(PATH. 'PrivateList')

->name('#\.php$#');

<?php
$store = new Store();

$store->in("/path/to/files". 'Catalog')

->in("/path/to/files". DS. 'Source')

->in("/path/to/files". 'PrivateList')

->name('#\.php$#');

?>

下面是跑上面的代碼100,000次的benchmarks的結果:

Calling function overtime 818.37 ms
Saving result in variable 364.93 ms
Saving result in static variable 175.72 ms
Result in constant 161.19 ms
Hardcoded literal 154.23 ms

現在,我們看到函數調用的衝擊性了。避免重複的函數調用能夠得到非常戲劇性的速度提升。Hardcode的字面值確實是最快的,但是獲得的提升是很少的。另一方面,靜態變量提供一個十分靈活的本地緩存的解決方案而且獲得客觀的速度提升。

爲誰的速度提升?

很顯然,代價昂貴的或慢得函數是我們的提升對象。重複調用的函數,像(模板)層的helper(幫助)或甚至是PHP的源生函數都可以考慮使用本文的技巧。

使用靜態變量容許本地優化,不依賴方法自身以外的很多代碼。沒有啓動成本,和沒有和其他全局變量衝突的可能。它對於函數以外的代碼完全是不可見的,就像它應該做的那樣。

另一方面,當緩存的值太多變數,或者函數並不是調用得很頻繁,處理緩存將會是一個太多的負擔。而且,用這裏的技巧來提速一個框架顯得完全無望。

English: http://178.62.231.40/cache-with-php-static-variables/