2009-09-22 34 views
2

目前在一個非常大的項目中,我不打算重新使用另一個站點,我將站點名稱硬編碼到各處的文件中。現在,如果我曾經改變網站名稱,那麼需要花費很多努力來改變這個地方。我知道明顯的解決方案就是將名稱存儲爲變量或常量,但我想你可以稱之爲我的微觀優化思維方式:我總是認爲這將是PHP必須解析的一件事。我意識到它不會有太大的區別,但我只是想知道使用像APC這樣的操作碼緩存是否意味着PHP甚至不需要重新解析它呢?PHP操作碼緩存的基礎知識

回答

6

真的:你不應該關心這樣的事情。

在配置將任何差異意味着更差(例如,apc.stat選項,APC,可以對你的服務器的負載相當的影響 - 而像DB查詢事情你將有數百個時間的影響更大)

這裏,大概是什麼重要的是可維護性:

  • 它讓你任何好處(除了從納米優化)有網站名稱不是硬編碼的?
  • 它有什麼好處,讓它硬編碼(同樣的例外)

如果兩種情況下的答案都是「否」,並且您的應用程序可以正常工作......那麼這就是關鍵所在!


如果你有時間的那種小於微的優化來消費,它可能會被更好地用於執行應用程序代碼會與一個分析器,通過你的數據庫查詢去,你正在做的HTTP請求的數量獲取靜態JS/CSS /圖像,升級PHP或修改您的代碼,以便它可以在PHP 5.3上運行(因爲PHP 5.3帶有一些優化超過5.2),...

所有這些將很可能給你一個較高的增益;-)的評論後


編輯:

基本上,當一個PHP文件加載:

  • 的從磁盤讀取文件
  • 將其解析並編譯爲操作碼
  • 個操作碼被執行

隨着操作碼緩存:

  • 如果在包含操作碼RAM的地方,那些從RAM(加載是,沒有一個文件的閱覽,也不解析/編譯)
    • 如果不是,請參閱之前的步驟 - 只需添加一個「存儲操作碼到RAM」執行前,爲下一個請求
  • 和O pcodes執行

apc.stat選項定義APC是否應該檢查文件的最後修改日期/時間使用的操作碼從RAM之間作出選擇,或重新編譯的文件,如果它是更近的操作代碼內存。

禁用該選項意味着:

  • 文件不檢查在磁盤=>更快,並且使用更少的資源
    • 例如,我已經看到CPU負荷的下降,10之間和15%,相當負載的服務器
  • 但由於沒有檢查進行修改,如果要考慮到修改禁用此選項時,你必須清除緩存


不過,我說的是真的:有可能是很多事情可以優化,這將意味着比簡單更重要的收穫「我應該使用硬編碼值」與「我應該使用常量/變量」。

+0

謝謝我只是好奇,我應該更多地瞭解操作碼緩存的工作原理 – JasonDavis 2009-09-22 20:47:27

2

這是笏到底會發生..沒有進入令牌層次的細節...

PHP是一種腳本語言,大多數人採取意味着它不會被編譯。雖然傳統意義上的這種情況是正確的,因爲我們沒有調用gcc或javac;相反,每次請求腳本時我們都在編譯。事實上,PHP和Java編譯生命週期非常相似,因爲它們都編譯到中間指令集(操作碼或字節碼),然後在虛擬機(Zend VM或JVM)中運行。

enter image description here

的解析和編譯階段是緩慢的。當我們添加一個opcache時,我們通過存儲解析和編譯階段的結果來短路這個過程,只留下執行動態的一如既往的動態。實際上,我們現在更接近Java的生命週期;主要區別在於我們保存到共享內存而不是文件,並且可以在腳本發生更改時自動重新編譯。

enter image description here

使用操作碼緩存。它可以爲您提供比任何微型優化都可能提升的性能。此外,使用Zend OpCache時,會爲您完成許多優化(例如,當不使用返回值時,將$ i ++切換爲++ $ i)。

使用操作碼緩存不應該是可選的,它將使您能夠通過很少的努力獲得更多的硬件性能。