2014-04-19 38 views
1

我有大約100個字符串變量,需要在PHP網站的每個網頁上提供。數據在運行時永遠不會改變,但將來我需要多組數據並在用於頁面請求的數據之間切換。字符串的長度從5到600個字符不等。我目前正在包含一個文件,其中包含這樣的數據:使用opcache在PHP中緩存靜態數據

$someStuff = "abc"; 
$otherStuff = "def"; 
// etc 

我正在使用opcache。這種方法會從opcache中受益多少?我看過this answer。如果緩存的好處值得做密鑰查找,我可以更改爲使用關聯數組。但是,對於我而言,使用靜態數組字段的類比聲明變量更適合我的情況,這一點我不清楚。

也許一個函數與靜態變量是一個好主意?這是否與靜態類字段相同,更好還是更差?

function getItem ($name) { 
    static $items = array("someStuff" => "abc"); 
    return $items[$name]; 
} 

也許函數而不是每個字符串的變量?如果不是所有的字符串都用於給定的頁面(通常是這種情況),這會更好嗎?

function someStuff() { return "abc"; } 
function otherStuff() { return "def"; } 

什麼是最佳解決方案?需要在每一頁上的數據,所以我想盡可能高效,避免從磁盤/數據庫中讀取等

回答

2

在實踐中並沒有區別,你是否做這樣的事情:

$someStuff = "abc"; 
$otherStuff = "def"; 
// ... 

$constants = array(
    'someStuff' => "abc"; 
    'otherStuff' = >"def"; 
    // ... 
); 

或根據我的其他答案將其封裝到類中的靜態數組中。使用OPcache將消除編譯開銷和磁盤I/O開銷。它將實習字符串常量,因此這些對於Zend引擎是有效的靜態可用的。類的版本做了一個單一的數組結構的副本,另外兩個版本將會執行〜200個操作碼exec來初始化〜100個變量,並且實際的被刪除的字符串再次被引用複製。引擎通常每秒解釋20-40M操作碼可執行文件,所以數學運算也是如此:無關緊要。

我的建議是:不要擔心運行時問題,只需選擇您覺得最清晰,最易維護的方法即可。就我個人而言,我會使用從自己的配置類文件自動加載到類的類,但這是你的應用程序,並做你最清楚的。

順便說一句,使用函數是凌亂的,他們確實有一個運行時成本,函數調用是最昂貴的PHP操作之一。對類常量的引用要便宜很多,但請嘗試對這些進行基準測試。但是,除非您提到每個請求的這些10k +次,否則您將不會注意到實質性差異。太聰明只會讓你「腳下射擊」。 :-)

+0

感謝您的解釋。我有一種感覺,現在擔心還爲時過早,但自從它在每一頁上都很難阻止自己。我已經去了類和靜態領域。乾杯! – NateS

+1

順便說一句,如果它們是真正的常量,那麼請閱讀[PHP類常量](http://www.php.net/manual/en/language.oop5.constants.php)。 – TerryE

+0

他們的確是。用一對正則表達式替換我的源代碼,我切換到類常量。使用opcache和類常量時有什麼開銷?恐怕微基準可能會測量錯誤的東西,或者很難測量每頁負載的開銷。此外,它主要是爲了滿足我的好奇心。 :) – NateS