一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

調(diào)整優(yōu)化您的LAMP應(yīng)用程序的5種簡單方法

簡介

Wikipedia、Facebook 和 Yahoo! 等主要 web 屬性使用 LAMP 架構(gòu)來為每天數(shù)百萬的請求提供服務(wù),而 Wordpress、Joomla、Drupal 和 SugarCRM 等 web 應(yīng)用程序軟件使用其架構(gòu)來讓組織輕松部署基于 web 的應(yīng)用程序。

該架構(gòu)的優(yōu)勢在于其簡單性。而 .NET 這樣的堆棧和 Java™ 技術(shù)可能使用大量硬件、昂貴的軟件棧和復(fù)雜的性能調(diào)優(yōu),LAMP 堆棧可以運(yùn)行于商品硬件之上,使用開源軟件棧。由于軟件棧是一個松散的組件集,而非一個整體堆棧,性能調(diào)優(yōu)是一大挑戰(zhàn),因為需要分析和調(diào)優(yōu)每個組件。

然而,這有幾個個簡單性能任務(wù)會對任何規(guī)模的網(wǎng)站的性能產(chǎn)生巨大的影響。在本文中,我們將探討旨在優(yōu)化 LAMP 應(yīng)用程序性能的 5 個這樣的任務(wù)。這些項目應(yīng)當(dāng)很少需要對您的應(yīng)用程序進(jìn)行架構(gòu)更改,使其成為最大化您的 web 應(yīng)用程序所需的響應(yīng)能力和硬件需求的安全、便捷的選擇。

使用操作碼緩存

提高任何 php 應(yīng)用程序(當(dāng)然是 LAMP 中的 “P”)的性能的最簡單方式是利用一個操作碼緩存。對于我使用的任何網(wǎng)站,它是我確保存在的一項內(nèi)容,因為性能影響很大(很多時候有了操作碼緩存,響應(yīng)時間可減少一半)。但是對 php 不熟悉的大部分人的一個很大的疑問是,為何改進(jìn)會如此之大。答案在于 php 如何處理 web 請求。圖 1 概覽了 php 請求的流程。


圖 1. php 請求
圖表展示 <a href=/itjie/phpjishu/ target=_blank class=infotextkey>php</a> 請求的流程,從 <a href=/itjie/phpjishu/ target=_blank class=infotextkey>php</a> 腳本到解析到最后的輸出 

由于 php 是一種解釋語言,而非 C 或 Java 等編譯語言,對每個請求執(zhí)行了 “解析-編譯-執(zhí)行” 的整個步驟。您可以看到為何這會耗時、耗資源,特別是當(dāng)腳本在請求之間很少變化時。解析和編譯腳本之后,腳本作為一系列操作碼處于機(jī)器可解析狀態(tài)。這是操作碼緩存發(fā)揮效用的地方。它作為一系列操作碼緩存這些編譯腳本,以避免為解析和編譯每個請求步驟。您將在圖 2 中看到這樣的工作流是如何運(yùn)作的。

圖 2. php 請求使用操作碼緩存
流程圖展示邏輯流如何檢查緩存的操作碼并跳過解析和編譯步驟(如果有的話) 

因此當(dāng) php 腳本的緩存操作碼存在時,我們可以跳過 php 請求流程的解析和編譯步驟,直接執(zhí)行緩存操作碼并輸出結(jié)果。檢查算法負(fù)責(zé)處理您可能對腳本文件進(jìn)行了更改的情況,因此在已變更腳本的第一個請求后,會為隨后的請求自動重新編譯和緩存操作碼,替換緩存的腳本。

操作碼緩存對于 php 流行已久,其中早期的一些要追溯到 php V4 的全盛期。目前有一些流行選項正在積極開發(fā)和使用中:

  • 替代 php 緩存(APC)可能是 php 最流行的操作碼緩存(參見 參考資料)。它由若干核心 php 開發(fā)人員所開發(fā),做出了很大貢獻(xiàn),F(xiàn)acebook 和 Yahoo! 的工程師賦予了其速度和穩(wěn)定性。它還支持用于處理 php 請求的若干其他速度改進(jìn),包括一個用戶緩存組件,這將在本文后面探討。
  • Wincache 是主要由 Microsoft® 的 InterNET Information Services (IIS) 團(tuán)隊積極開發(fā)的一個操作碼緩存,僅供在使用 IIS web 服務(wù)器的 Windows® 上使用(參見 參考資料)。開發(fā)它的主要動力在于使 php 成為 Windows-IIS-php 堆棧上的一流開發(fā)平臺,因為據(jù)知 APC 在該堆棧上運(yùn)作的不是很好。它在功能上非常類似于 APC,且支持一個用戶緩存組件,以及一個內(nèi)置會話處理程序,以將 Wincache 作為一個會話處理程序直接加以利用。
  • eAccelerator 是原始 php 緩存之一 Turck MMCache 操作碼緩存(參見 參考資料)的一個派生。不同于 APC 和 Wincache,它僅是一個操作碼緩存和優(yōu)化器,因此它不包含用戶緩存組件。它在 UNIX® 和 Windows 堆棧上完全兼容,且對于不打算利用 APC 或 Wincache 提供的其他功能的站點很流行。如果您要使用 memcache 這樣的解決方案來為多 web 服務(wù)器環(huán)境提供一個單獨(dú)的用戶緩存服務(wù)器,那么這就是常見情況。

毫無疑問,一個操作碼緩存是通過在每次請求后消除解析和編譯腳本的需要來加速 php 的第一步。完成第一步之后,您應(yīng)當(dāng)看到響應(yīng)時間和服務(wù)器負(fù)載方面的改進(jìn)。但是優(yōu)化 php 可以做的不止這些,我們接下來將加以討論。

優(yōu)化您的 php 設(shè)置

雖然實現(xiàn)操作碼緩存是性能改進(jìn)的一大創(chuàng)舉,不過也有大量其他優(yōu)化選項可供您基于 php.ini 文件中的設(shè)置優(yōu)化您的 php 設(shè)置。這些設(shè)置更適合于生產(chǎn)實例;在開發(fā)或測試實例上,您可能不希望做這些變更,因為它會使得應(yīng)用程序問題的調(diào)試變得更難。

讓我們看一下對于性能提升很重要的一些項目。

應(yīng)當(dāng)禁用的選項

有若干 php.ini 設(shè)置應(yīng)當(dāng)予以禁用,因為它們常用作向后兼容性:

  • register_globals ― 在 php V4.2 之前該功能常常是默認(rèn)值,其中傳入的請求變量被自動賦給普通 php 變量。這樣做除了引起重大安全問題之外(使未過濾的傳入請求數(shù)據(jù)與普通 php 變量內(nèi)容相混),對每一個請求這樣做還會產(chǎn)生開銷。因此禁用這一設(shè)置使您的應(yīng)用程序更安全且能提高性能。
  • magic_quotes_* ― 這是 php V4 的另一遺留項,其中傳入的數(shù)據(jù)會自動避開有風(fēng)險的表單數(shù)據(jù)。它旨在作為一個安全特性,在將傳入的數(shù)據(jù)發(fā)送到數(shù)據(jù)庫之前對其進(jìn)行整理,但不是很有效,因為它不能幫助用戶預(yù)防常見的 SQL 注入攻擊。由于大部分?jǐn)?shù)據(jù)庫層支持能更好地處理該風(fēng)險的準(zhǔn)備語句,禁用該設(shè)置會再次消除這個煩人的性能問題。
  • always_populate_raw_post_data ― 這僅當(dāng)您出于某些原因需要查看傳入的未過濾 POST 數(shù)據(jù)的整個負(fù)載時才需要。否則,它僅在內(nèi)存中存儲 POST 數(shù)據(jù)的一個副本,而這沒有必要。

然而,在遺留代碼上禁用這些選項會有風(fēng)險,因為它們可能取決于其設(shè)置來實現(xiàn)正確執(zhí)行。不應(yīng)當(dāng)基于被設(shè)置的這些選項來開發(fā)任何新代碼,而且可能的話,您應(yīng)當(dāng)尋求方法來重構(gòu)您的現(xiàn)有代碼,避免使用它們。

應(yīng)當(dāng)禁用或調(diào)整設(shè)置的選項

您可以啟用 php.ini 文件的一些優(yōu)秀性能選項,來提升您的腳本速度:

  • output_buffering ― 您應(yīng)當(dāng)確保啟用該選項,因為它會以塊為單位將輸出刷回到瀏覽器,而非以每個 echo 或 print 語句為單位,而后者會大大減緩您的請求響應(yīng)時間。
  • variables_order ― 這個指令控制傳入請求的 EGPCS(EnvironmentGetPostCookie 和 Server)變量解析順序。如果您沒有使用某種超全局變量(比如環(huán)境變量),您可以安全地刪除它們來獲得一點加速,從而避免在每一個請求上解析它們。
  • date.timezone ― 這是在 php V5.1 中添加的一個指令,用于設(shè)置默認(rèn)時區(qū),然后用于后面將要介紹的 DateTime 函數(shù)。如果您不在 php.ini 文件中設(shè)置該選項,php 會執(zhí)行大量系統(tǒng)請求來弄清它是什么,且在 php V5.3 中,對每一個請求會發(fā)出一個警告。

就以應(yīng)當(dāng)在您的生產(chǎn)實例上配置的設(shè)置而言,這些被看作是 “唾手可得”。就 php 而言,還有一件事需要考慮。這就是您的應(yīng)用程序中 require() 和 include()(以及其同級 require_once() 和 include_once())的使用。這些函數(shù)優(yōu)化您的 php 配置和代碼,以防止對每個請求進(jìn)行不必要的文件狀態(tài)檢查,從而減少響應(yīng)時間。

管理您的 require() 和 include()

從性能來看,文件狀態(tài)調(diào)用(即為檢查一個文件是否存在而對底層文件系統(tǒng)進(jìn)行的調(diào)用)相當(dāng)昂貴。文件狀態(tài)的最大元兇之一以 require() 和 include() 語句的形式出現(xiàn),這兩個語句用于將代碼帶到腳本中。require_once() 和 include_once() 的同級調(diào)用更成問題,因為它們不僅需要驗證文件是否存在,而且它之前沒有包含在內(nèi)。

那么解決這個問題的最好方式是什么?您可以做一些事來加快解決。

  • 為所有 require() 和 include() 調(diào)用使用絕對路徑。這將使 php 更清楚您希望包含的確切文件,因此無需為您的文件檢查整個 include_path
  • 保持 include_path 中的條目數(shù)較低。這在很難為每個 require() 和 include() 調(diào)用提供絕對路徑的情況(通常在大型遺留應(yīng)用程序中會出現(xiàn)這種情況)下很有用,方法就是不檢查您包含的文件不在的位置。

APC 和 Wincache 還有用于緩存 php 進(jìn)行的文件狀態(tài)檢查結(jié)果的機(jī)制,因此無需進(jìn)行反復(fù)的文件系統(tǒng)檢查。當(dāng)您將 include 文件名保留為靜態(tài)而非變量驅(qū)動的時,它們最有效,因此盡可能嘗試這樣做很有用。

優(yōu)化您的數(shù)據(jù)庫

數(shù)據(jù)庫優(yōu)化很快會成為一個前沿話題,我?guī)缀鯖]有空間在這里完全公正地做這個話題。但是如果您在尋求優(yōu)化您的數(shù)據(jù)庫的速度,首先應(yīng)當(dāng)采取一些步驟,這應(yīng)當(dāng)對常見問題有所幫助。

將數(shù)據(jù)庫放在自己的機(jī)器上

數(shù)據(jù)庫查詢自身可以變得相當(dāng)激烈,通常在對大小合理的數(shù)據(jù)集執(zhí)行簡單的 SELECT 語句時限定在 100% 的 CPU。如果您的 web 服務(wù)器和數(shù)據(jù)庫服務(wù)器都在竟用單一機(jī)器上的 CPU 時間,這無疑將減慢您的請求速度。因此我想第一步最好是將 web 服務(wù)器和數(shù)據(jù)庫服務(wù)器放在單獨(dú)的機(jī)器上,確保您的數(shù)據(jù)庫服務(wù)器是兩者中更強(qiáng)健的(數(shù)據(jù)庫服務(wù)器喜歡大量內(nèi)存和多個 CPU)。

合理設(shè)計和編制表索引

數(shù)據(jù)庫性能的最大問題可能源自于不良數(shù)據(jù)庫設(shè)計和缺失索引。SELECT 語句通常是運(yùn)行在典型 web 應(yīng)用程序中的最常見的查詢類型。它們也是在數(shù)據(jù)庫服務(wù)器上運(yùn)行的最耗時的查詢。此外,這些類型的 SQL 語句對適當(dāng)?shù)乃饕蛿?shù)據(jù)庫設(shè)計最敏感,因此查看以下指示,獲取實現(xiàn)最優(yōu)性能的技巧。

  • 確保每個表都有一個主鍵。這為表提供一個默認(rèn)順序和快速方式來聯(lián)接其他表。
  • 確保一個表中的任何外鍵(即鏈接記錄到另一個表中的記錄的鍵)的索引得到合理編制。許多數(shù)據(jù)庫會自動對這些鍵施加約束,以便值真正匹配另一個表中的一條記錄,這有助于擺脫這一困難。
  • 試圖限制一個表中的列數(shù)。一個表中有太多列比僅有一些列時進(jìn)行查詢所需的掃描時間要長。此外,如果您有不常用的含多個列的一個表,您也在通過 NULL 值字段浪費(fèi)磁盤空間。文本或 blob 等可變大小字段也是如此,其中表大小的增長可以遠(yuǎn)超過需求。在這種情況下,您應(yīng)當(dāng)考慮將其他欄分成不同的表,在記錄的主鍵上將其聯(lián)合起來。

分析在服務(wù)器上運(yùn)行的查詢

改進(jìn)數(shù)據(jù)庫性能的最佳方法是分析在您的數(shù)據(jù)庫服務(wù)器上運(yùn)行什么查詢,且運(yùn)行它們需要多長時間。幾乎每個數(shù)據(jù)庫都有具有這種功能的工具。對于 MySQL,您可以利用慢查詢?nèi)罩緛聿檎矣袉栴}的查詢。要使用它,在 MySQL 配置文件中將 slow_query_log 設(shè)置為 1,然后將 log_output 設(shè)置為 FILE,將它們記錄到文件 hostname-slow.log 中。您可以設(shè)置 long_query_time 閾值,確定查詢必須運(yùn)行多少秒才被看作是 “慢查詢”。我想建議將該閾值首先設(shè)置為 5 秒,隨著時間的推移將其縮減為 1 秒,具體取決于您的數(shù)據(jù)集。如果您探究該文件,您會看到類似于清單 1 的詳細(xì)查詢。


清單 1. MySQL 慢查詢?nèi)罩?/STRONG>

				/usr/local/mysql/bin/mysqld, Version: 5.1.49-log, started with:Tcp port: 3306 Unix socket: /tmp/mysql.sockTime         Id Command  Argument# Time: 030207 15:03:33# User@Host: user[user] @ localhost.localdomain [127.0.0.1]# Query_time: 13 Lock_time: 0 Rows_sent: 117 Rows_examined: 234use sugarcrm;select * from accounts inner join leads on accounts.id = leads.account_id;

我們想要考慮的關(guān)鍵對象是 Query_time,顯示查詢需要的時間。另一項要考慮的是 Rows_sent 和 Rows_examined 的數(shù)量,因為這些可指這樣的情況:其中如果一個查詢察看太多行或返回太多行,就會被錯誤地書寫。您可以更深入地鉆研如何寫查詢,即在查詢開始處加上 EXPLAIN,它會返回查詢計劃,而非結(jié)果集,如清單 2 所示。


清單 2. MySQL EXPLAIN 結(jié)果

				mysql> explain select * from accounts inner join leads on accounts.id = leads.account_id;+----+-------------+----------+--------+--------------------------+---------+---| id | select_type | table  | type  | possible_keys       | key   | key_len | ref            | rows | Extra |+----+-------------+----------+--------+--------------------------+---------+--------| 1 | SIMPLE   | leads  | ALL  | idx_leads_acct_del    | NULL  | NULL  | NULL           | 200 |    || 1 | SIMPLE   | accounts | eq_ref | PRIMARY,idx_accnt_id_del | PRIMARY | 108  | sugarcrm.leads.account_id |  1 |    |+----+-------------+----------+--------+--------------------------+---------+---------2 rows in set (0.00 sec)

MySQL 手冊更深入探究 EXPLAIN 輸出的主題(參見 參考資料),但是我考慮的一項重要內(nèi)容是 ‘type' 列為 ‘ALL' 的地方,因為這需要 MySQL 做一個全表掃描,且不需要鍵來執(zhí)行查詢。這些幫助您在添加索引時會大幅提高查詢速度。

有效緩存數(shù)據(jù)

正如我們在上一節(jié)看到的,數(shù)據(jù)庫往往容易成為您 web 應(yīng)用程序性能的最大痛點。但是如果您要查詢的數(shù)據(jù)不經(jīng)常改變怎么辦?在這種情況下,一個好的選擇就是在本地存儲這些結(jié)果,而非針對每個請求調(diào)用查詢。

我們之前探究的兩個操作碼緩存 APC 和 Wincache 具有實現(xiàn)上述操作的工具,其中您可以將 php 數(shù)據(jù)直接存儲到一個共享內(nèi)存段中,便于快速查詢。清單 3 提供了具體示例。


清單 3. 使用 APC 緩存數(shù)據(jù)庫結(jié)果的示例

				<?phpfunction getListOfUsers(){  $list = apc_fetch('getListOfUsers');    if ( empty($list) ) {    $conn = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbuser', 'dbpass');    $sql = 'SELECT id, name FROM users ORDER BY name';    foreach ($conn->query($sql) as $row) {      $list[] = $row;    }        apc_store('getListOfUsers',$list);  }    return $list;}

我們僅需一次執(zhí)行查詢。之后,我們將結(jié)果推送到 getListOfUsers 鍵下的 APC 緩存中。從這里開始,直到緩存到期,您就能夠直接從緩存中獲取結(jié)果數(shù)組,跳過 SQL 查詢。

APC 和 Wincache 并非一個用戶緩存的惟一選擇;memcache 和 Redis 是不需要您在與 Web 服務(wù)器相同的服務(wù)器上運(yùn)行用戶緩存的其他流行選擇。這就提高了性能和靈活性,特別是當(dāng)您的 web 應(yīng)用程序跨多個 Web 服務(wù)器向外擴(kuò)展時。

在本文中,我們探究了調(diào)優(yōu)您的 LAMP 性能的 5 種簡單方法。我們不僅通過利用一個操作碼緩存和優(yōu)化 php 配置探究了 php 級別的技術(shù),而且探究了如何優(yōu)化您的數(shù)據(jù)庫設(shè)計來實現(xiàn)合理的索引編制。我們還探討了如何利用一個用戶緩存(以 APC 為例)來展示如何在數(shù)據(jù)不經(jīng)常改變時避免重復(fù)的數(shù)據(jù)庫調(diào)用。

php技術(shù)調(diào)整優(yōu)化您的LAMP應(yīng)用程序的5種簡單方法,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 俏佳人忘忧草wyc.ia | 成人免费观看在线网址 | 国产精选在线观看 | 天天综合网天天综合色 | 操吊视频 | 国产在线91观看免费观看 | 2021国产麻豆剧 | 怡红院视频在线观看最新 | 日韩专区亚洲国产精品 | 99精品伊人久久久大香线蕉 | 国产欧美一区二区精品性色tv | 国产成人精品福利网站在线观看 | 久久精品国产久金国产思思 | 制服丝袜怡红院 | 精品国产福利 | 国产欧美一区二区三区在线看 | 综合亚洲色图 | 国产日韩欧美成人 | 国产拍在线 | 成人午夜在线播放 | 思99re久久这里只有精品首页 | 狠狠操伊人 | 午夜噜噜 | 久久综合九色婷婷97 | 伊人色网站| 欧美人禽杂交 | 亚洲综合免费 | 精品久久影院 | 性视频一区| 三级网站免费播放国语 | 国产原创91 | 亚洲精品www久久久久久 | 亚洲美女视频网 | 一区二区高清视频在线观看 | 每日更新国产 | 日本不卡一区二区三区四区 | 成人精品一级毛片 | 日本一区二区三区视频在线 | 一区二区视频在线免费观看 | 激情欧美一区二区三区中文字幕 | 日韩中文字幕精品一区在线 |