調優LAMP應用程序的5種簡單方法:優化您的 PHP 設置
調優LAMP 應用程序的5 種簡單方法:
簡介
Wikipedia、Facebook 和 Yahoo! 等主要 web 屬性使用 LAMP 架構來為每天數百萬的請求提供服務,而 Wordpress、Joomla、Drupal 和 SugarCRM 等 web 應用程序軟件使用其架構來讓組織輕松部署基于 web 的應用程序。
該架構的優勢在于其簡單性。而 .NET 這樣的堆棧和 Java™ 技術可能使用大量硬件、昂貴的軟件棧和復雜的性能調優,LAMP 堆棧可以運行于商品硬件之上,使用開源軟件棧。由于軟件棧是一個松散的組件集,而非一個整體堆棧,性能調優是一大挑戰,因為需要分析和調優每個組件。
然而,這有幾個個簡單性能任務會對任何規模的網站的性能產生巨大的影響。在本文中,我們將探討旨在優化 LAMP 應用程序性能的 5 個這樣的任務。這些項目應當很少需要對您的應用程序進行架構更改,使其成為最大化您的 web 應用程序所需的響應能力和硬件需求的安全、便捷的選擇。
優化您的 PHP 設置
雖然實現操作碼緩存是性能改進的一大創舉,不過也有大量其他優化選項可供您基于 php.ini 文件中的設置優化您的 PHP 設置。這些設置更適合于生產實例;在開發或測試實例上,您可能不希望做這些變更,因為它會使得應用程序問題的調試變得更難。
讓我們看一下對于性能提升很重要的一些項目。
應當禁用的選項
有若干 php.ini 設置應當予以禁用,因為它們常用作向后兼容性:
•register_globals — 在 PHP V4.2 之前該功能常常是默認值,其中傳入的請求變量被自動賦給普通 PHP 變量。這樣做除了引起重大安全問題之外(使未過濾的傳入請求數據與普通 PHP 變量內容相混),對每一個請求這樣做還會產生開銷。因此禁用這一設置使您的應用程序更安全且能提高性能。
•magic_quotes_* — 這是 PHP V4 的另一遺留項,其中傳入的數據會自動避開有風險的表單數據。它旨在作為一個安全特性,在將傳入的數據發送到數據庫之前對其進行整理,但不是很有效,因為它不能幫助用戶預防常見的 SQL 注入攻擊。由于大部分數據庫層支持能更好地處理該風險的準備語句,禁用該設置會再次消除這個煩人的性能問題。
•always_populate_raw_post_data — 這僅當您出于某些原因需要查看傳入的未過濾 POST 數據的整個負載時才需要。否則,它僅在內存中存儲 POST 數據的一個副本,而這沒有必要。
然而,在遺留代碼上禁用這些選項會有風險,因為它們可能取決于其設置來實現正確執行。不應當基于被設置的這些選項來開發任何新代碼,而且可能的話,您應當尋求方法來重構您的現有代碼,避免使用它們。
應當禁用或調整設置的選項
您可以啟用 php.ini 文件的一些優秀性能選項,來提升您的腳本速度:
•output_buffering — 您應當確保啟用該選項,因為它會以塊為單位將輸出刷回到瀏覽器,而非以每個 echo 或 print 語句為單位,而后者會大大減緩您的請求響應時間。
•variables_order — 這個指令控制傳入請求的 EGPCS(Environment、Get、Post、Cookie 和 Server)變量解析順序。如果您沒有使用某種超全局變量(比如環境變量),您可以安全地刪除它們來獲得一點加速,從而避免在每一個請求上解析它們。
•date.timezone — 這是在 PHP V5.1 中添加的一個指令,用于設置默認時區,然后用于后面將要介紹的 DateTime 函數。如果您不在 php.ini 文件中設置該選項,PHP 會執行大量系統請求來弄清它是什么,且在 PHP V5.3 中,對每一個請求會發出一個警告。
就以應當在您的生產實例上配置的設置而言,這些被看作是 “唾手可得”。就 PHP 而言,還有一件事需要考慮。這就是您的應用程序中 require() 和 include()(以及其同級 require_once() 和 include_once())的使用。這些函數優化您的 PHP 配置和代碼,以防止對每個請求進行不必要的文件狀態檢查,從而減少響應時間。
本節講述的是:優化 PHP 設置、下一節講述:管理require和include