高性能PHP應用開發-總結


最近將《高性能PHP應用開發》這本書看了兩遍,覺得還是受益匪淺的,該書講的面比較廣,都是經驗性的內容,建議大家有時間可以詳細看一下的,基於此特意將本書的精華易用的部分加以整理,子曰:“溫故而知新,可以為師矣。”

 

 


[第一章  基准測試工具]

一:Apache Benchmark (ab) 

隨 apache包一起安裝
ab -n (請求數) -c (並發數,不能起過-n) -t (請求的秒數) http://url

報告中最重要的是以下字段內容:
-------------------------
HTML transferred  請求的內容總大小 
Requests per second 每秒最多支持的並發數請求數
Time per request 一個請求需要的總時間
Time per request 所有總發請求中的一個請求時間
-------------------------

二:Siege [可以指定URL列表文件]
安裝:
wget ftp://ftp.joedog.org/pub/siege/siege-latest.tar.gz 
tar xvfz siege-latest.tar.gz 
cd siege-2.69/ 
./configure 
make && install

siege -c (並發數) -t(時間數)([S(秒)/M(分)/H(小時)]) [URL] -i -f (URL列表文件)

報告中最重要的是以下字段內容:
-------------------------
Data transferred 響應中數據的總大小(不包括標記頭數據)
Transaction rate 每秒要滿足的事務總數
Longest transaction 滿足一個請求所需的最長時間
Shortest transaction 滿足一個請求所需的最短時間
[其它說明]
Transactions 已完成的事務總數
Availability 能夠請求WEB文檔的時間
Elapsed Time 完成測試所需的總時間
Response time 整個測試過程中的平均響應時間
Throughput 處理數據和響應所需的總時間
Concurrency 同時連接的平均數,該數字升高時服務器性能降低
Successful transactions 整個測試過程中執行成功的事務總數
Failed transactions 整個測試過程中執行成功的失敗總數
-------------------------


[第二章  提高客戶端下載和呈現性能]

一:工具集:
firebug / YSlow / Page Speed  - YUI Compressor / Closure Compiler / Smush.it

Firebug Net選項卡顏色的含義
-------------------------------------
紫色 瀏覽器正在等待資源
灰色 正在接收資源
紅色 正在發送
綠色 正在連接
藍色 DNS查找
-------------------------------------

二:YSlow V2 規則集

(一):CSS優化
1:將樣式CSS文件放在頂部
2:避免CSS表達式
3:壓縮CSS文件

(二):圖像優化規則
1:使用所要要求的圖像大小,而不是用樣式來調整大小
2:可能的情況下創建畫面,即將所有的小圖標都放在一個大圖中,采用訂位方式呈現

(三):javascript優化規則
1:將JS文件放在層部
2:將JS代碼做成外部文件
3:壓縮JS文件大小

(四):服務器優化
1:采用CDN
2:采用 Gzip/bzip2 壓縮
3:減少DNS的查找
4:實現 Etag

YSlow 評分是從 A=>D (高到底)

三:圖片使用通用規則:

使用GIF做頁面上徽標和小圖標,用JPEG呈現照片,其它一切圖片使用PNG格式。
圖片可以使用 YSlow->Tools->Smush.it


[第三章  PHP代碼優化]


1:使用 require 比 require_once 快(stat調用次數少)
require_once() 在導入腳本時要進行大量的操作狀態調用,如果文件位於
/data/web/html/php/a.php 則每個目錄都要進行一次stat的調用。

2:提示計算循環的次數

3:盡可能的使用 foreach 方便數據,它的速度最快.

4:文件讀取原則:
小文件(<1M)使用: fread() 快點
大文件(>=1M)使用: file_get_contents() 快點


[第四章  Opcode緩存]

1:Alternative PHP Cache (APC)

安裝源:http://downloads.php.net/pierre/

(APC常用設置)
-----------------------------------------
apc.cache_by_default 默認啟用緩存.1:啟用 0:禁用
apc.filters 采用正則表達式來判斷是要緩存的文件
apc.stat 是否啟用對請求腳本的更新檢查,每次調用腳本時都會執行這個過程,
1:啟用 0:禁用,如果有對PHP腳本更改的話則要重啟WEB服務器
apc.enabled 是否啟用緩存 1:啟用 0:禁用
apc.shm_size 設置共享內存的大小,以M為單位
apc.shm_segments 可用的共享內存段總數
apc.include_once_override 是否啟用對include_once和require_once的優化,
啟用時可以減少stat的調用. 1:啟用 0:禁用
apc.optimization 優化級別,0:禁用該功能,設置為較高數值可以提高優化級別 1-9
apc.num_files_hint 設置你認為要緩存的文件數,默認是1000,如果不確定則設置為0,
設置為實際數可以提高性能.
apc.ttl 設置緩存的過期時間,只有到達過期時間時才會從緩存中清除,單位:秒
apc.write_lock 開啟該選項時將強制單個進程緩存特定的腳本,適用於必須緩存多
個文件的大流量WEB應用.
-----------------------------------------
(APC配置示例)
extension=apc.so 
apc.enabled=on 
apc.shm_size=16 
apc.include_once_override=1 
apc.write_lock=1 
apc.optimization=9 
apc.stat=0 
apc.num_files_hint=5 

(APC管理工具)
安裝包中自帶了 apc.php 這個網頁工具,放到Web服務目錄下就可以運行了.


2:XCache

安裝源: http://xcache.lighttpd.net
[XCache]
Zend_extension_ts=php_xcache.dll  (ts:表示線程安全)

(XCache常用設置)
-----------------------------------------
xcache.admin.user (string)認證用戶名
xcache.admin.pass (string)認證密碼
xcache.admin.enable_auth (string)是否啟用認證,默認: 'on'
xcache.test (string)是否啟用測試功能
xcache.coredump_dir (string)故障時放置核心轉儲的目錄,該目錄必需PHP有寫權限,
保留為空時代表禁用
xcache.cacher (Boolean) 是否啟用緩存,默認啟用
xcache.size (int) 共享緩存大小,如果為0則緩存將無法使用
xcache.count (int)緩存被分配的"塊"數,默認為1
xcache.slots 哈希表提示,數字越大,哈希表內進行的搜索速度就越快,此值越大,
所需要的內存也越多
xcache.ttl (int) Opcode文件的生存時間,如果為0則無限期緩存
xcache.gc_interval (int)觸發垃圾回收的時間間隔,默認為0
xcache.var_size (int)變量大小
xcache.var_count (int)變量個數
xcache.var_slots 可變數據槽設置
xcache.var_ttl (秒)可變數據的生存時間,默認為0
xcache.var_maxttl (秒)處理變量時最大的生存時間
xcache.var_gc_interval (秒)垃圾回收的生存時間
xcache.readonly_protection (Boolean)啟用時會減慢工具的運行速度,但更加安全.
xcache.mmap_path  (String) 用戶只讀保護的文件路徑.這將限制兩個PHP組共享同一個 /tmp/cache 目錄
xcache.optimizer  (Boolean) 是否啟用優化,默認:關閉
xcache.coverager  (Boolean) 啟用覆蓋范圍數據集合,啟用后會減慢運行過程
xcaceh.coveragedump_directory (String) 放置數據集合信息的目錄,默認:/tmp/pcovis
-----------------------------------------

3:eAccelerator (可以將緩存存在磁盤上)

安裝源: http://www.eaccelerator.net
wget http://bart.eaccelerator.net/source/0.9.6.1/eaccelerator-0.9.6.1.tar.bz2  
tar xvjf eaccelerator-0.9.6.1.tar.bz2 
phpize 
./configure 
make && make install

(緩存數據的方法)
eaccelerator.keys = [shm_and_disk:默認值,如果內存空間不足就存入磁盤 shm_only:只使用內存 
disk_only:只使用硬盤]

默認的存放目錄:/tmp/eaccelerator 在每次系統重啟時會清空,建議更改為以下目錄
mkdir -p /var/cache/eaccelerator
chmod 0777 -R /var/cache/eaccelerator

(eA配置項說明)
----------------------------------------------------
eaccelerator.shm_size
共享內存大小,單位: MB. “0″代表操作系統默認。默認值為 “0″。

eaccelerator.cache_dir
磁盤緩存的目錄。默認值為 “/tmp/eaccelerator”

eaccelerator.enable
開啟或關閉 eAccelerator。”1″ 為開啟,”0″ 為關閉。默認值為 “1″。

eaccelerator.optimizer
開啟或關閉內部優化器,可以提升代碼執行速度。”1″ 為開啟,”0″ 為關閉。默認值為 “1″。

eaccelerator.debug
是否啟用調試日志,日志記錄在eaccelerator.log_file中 。”1″ 為開啟,”0″ 為關閉。默認值為 “0″。

eaccelerator.log_file
目錄文件,沒有指定時所有的日志在 stderr 中,如果使用 apache則在apache的日志中

eaccelerator.name_sapce
一個所有鍵(keys)的前綴字符串。如果設置該前綴字符串則允許 .htaccess 或者主配置文件在相同主機上運行兩個相同的鍵名。

eaccelerator.check_mtime
開啟或關閉 PHP 文件改動檢查。”1″ 為開啟,”0″ 為關閉。如果您想要在修改后重新編譯 PHP 程序則需要設置為 “1″。默認值為 “1″。

eaccelerator.filter
判斷哪些 PHP 文件必須緩存。您可以指定緩存和不緩存的文件類型(如 “*.php *.phtml”等)。如果參數以 “!” 開頭,則匹配這些參數的文件被忽略緩存。默認值為 “”所有 PHP 文件都將被緩存。

eaccelerator.shm_max
當使用 ” eaccelerator_put() ” 函數時禁止其向共享內存中存儲過大的文件。該參數指定允許存儲的最大值,單位: 字節 (10240,10K,1M)。”0″ 為不限制。默認值為 “0″。

eaccelerator.shm_ttl
當 eAccelerator 獲取新腳本的共享內存大小失敗時,它將從共享內存中刪除所有在最后 “shm_ttl” 秒內無法存取的腳本緩存。默認值為 “0″,即: 不從共享內春中刪除任何緩存文件。

eaccelerator.shm_prune_period
當 eAccelerator 獲取新腳本的共享內存大小失敗時,他將試圖從共享內存中刪除早於 “shm_prune_period” 秒的緩存腳本。默認值為 “0″,即: 不從共享內春中刪除任何緩存文件。

eaccelerator.shm_only
允許或禁止將已編譯腳本緩存在磁盤上。該選項對 session 數據和內容緩存無效。默認值為 “0″,即: 使用磁盤和共享內存進行緩存。

eaccelerator.compress
允許或禁止壓縮內容緩存。默認值為 “1″,即: 允許壓縮.

eaccelerator.compress_level
指定內容緩存的壓縮等級。默認值為 “9″,為最高等級.

eaccelerator.keys
eaccelerator.sessions
eaccelerator.content
判斷哪些鍵(keys),session 數據和內容將被緩存。
可用參數值為: 
“shm_and_disk” – 同時在共享內存和磁盤中緩存數據(默認值); 
“shm” – 如果共享內存用盡或者數據容量大於 “eaccelerator.shm_max”,則在共享內存或磁盤中緩存數據; 
“shm_only” – 僅在共享內存中緩存數據; 
“disk_only” – 僅在磁盤中緩存數據; 
“none” – 禁止緩存數據。

eaccelerator.admin.name 用戶名
eaccelerator.admin.password 密碼
eaccelerator.allowed_admin_path 該腳本路徑允許獲得管理信息並進行管理控制.
----------------------------------------------------

(eA配置示例)
extension="eaccelerator.so" 
eaccelerator.shm_size="16" 
eaccelerator.cache_dir="/var/cache/eaccelerator" 
eaccelerator.enable="1" 
eaccelerator.optimizer="1" 
eaccelerator.check_mtime="1" 
eaccelerator.debug="0" 
eaccelerator.filter="" 
eaccelerator.shm_max="0" 
eaccelerator.shm_ttl="0" 
eaccelerator.shm_prune_period="0" 
eaccelerator.shm_only="0" 
eaccelerator.compress="1" 
eaccelerator.compress_level="9" 


[第五章  變量緩存]
Apc/ Memcache 安裝源: http://www.memcached.org


[第六章  選擇正確的Web報務器]

一:綜合要考慮的問題

1:安全性和穩定性非常重要
apache是當前最安全和穩定的服務程序包.

2:找到具有豐富知識和經驗的工程師非常重要
如果你想找到一流的Web服務技術工程師,Apaceh是最佳選擇

3:你的網站是否主要是靜態內容
如果絕大部分是靜態內容,推薦使用 Nginx/Lighttpd

4:你在托管服務中托管
如果你是在托管服務中,在采用依賴非Apaceh時,要查詢一下托管服務沒是否支持的.

5;你正在使用不常見的PHP擴展
大多數PHP擴展在開發時是在帶有 mod_php 模塊的apaceh上開發,Nginx/Lighttpd 使用的
FCGI模式下通常沒有做過嚴格的測試,在選擇這些WEB服務前一定檢查是否能在 FCGI模式下運行正常.

二:Web服務器的分類

(Prefork/Fork)
基於進程的Web服務器,使用fock進程來滿足每個請求;推薦單CPU或數據庫集成/文件處理的
應用程序使用這種類型,因為第三方的擴展中大部分未證明是線程安全的.

(Threaded)
基於線程的Web服務器,使用線程來滿足每個請求;

三:Apache HTTPD

命令行參數 httpd -h
-----------------------------------------
-D name 設置名稱以便在<ifDefine name>指令中使用
-d directory 設置 ServerRoot
-f file 設置ServerConfigFile
-C "directive" 在讀取配置文件之前對指令進行處理
-c 在讀取配置文件之后對指令進行處理
-e level 顯示日志級別為"level"的啟動錯誤
-E file 將啟動錯誤記錄記錄到'file'文件中
-V 顯示編譯設置
-l 列出已編譯的模塊
-L 列出可用的配置指令
-t -D DUMP_VHOSTS 顯示所有的Vhost設置
-S (-t -D DUMP_VHOSTS 的快捷方式)
-t -D DUMP_MODULES 顯示已加載的模塊
-M (-t -D DUMP_MODULES 的快捷方式)
-t 檢查配置文件語法
-----------------------------------------

Apache中可用的MPM(多處理模塊)列表
-------------------------------------------
Prefork: 預告創建一組子進程.(默認安裝方式)
Perchild: Prefork的一個變體,它允許為子進程設置單獨的進程權限
Threadpool: 使用多線程來實現對請求的處理-大多數Unix類系統不建議使用,原來是無法保證線程安全.
Worker: Prefork和Threadpool的混合,其中每個子進程都支持多個線程.
-------------------------------------------
建議使用 Prefork MPM,任何多線程的MPM都是不推薦的,因為多很綁定到Apache和PHP解釋器的庫文件
都未證明的是線程安全的.

(安裝其它Web服務時結合Fast-Cgi模式的PHP配置)
#[FastCGI PHP]
cgi.fix_pathinfo = 1 (修復以前CGI實現中的一個BUG)


[第七章  優化Web服務器和內容交付]

1:測定 Web服務器的性能

ApacheTop 安裝
--------------------------------------------------------------
wget http://www.webta.org/apachetop/apachetop-0.12.6.tar.gz 
sudo yum install readline-devel 
sudo yum install ncurses-devel 
sudo yum install pcre-devel 
tar xvzf apachetop-0.12.6.tar.gz 
cd apachetop-0.12.6 
./configure 
make 
sudo make install 
--------------------------------------------------------------

使用: apachetop -f /var/log/apache2/access_log 參數說明如下:
-----------------------------------------------------------
-f:logfile打開被監控的日志文件
-H hits:窗口顯示最新的hits條訪問記錄.例:-H 10
-T sec:窗口顯示的url訪問記錄清空時間間隔,默認30秒..
-d secs:窗口顯示的數據刷新時間,默認5秒刷新一次.例:-d 2
示例:apachetop -f /usr/local/nginx/logs/access_log -T 500 -d 2


介面參數詳細說明如下:
----------------------------------------------
第一行:分別是上次點擊時的時間、apachetop運行總時間、現在的時間
第二,四行:表示的是請求數、平均每秒請求數、平均每秒傳輸量、平均每請求傳輸量; 
不同的是,第二行是從apachetop開始運行計算的,第四行是從上一次清空請求時開始計算的,
在行首的括號里的時間,這個時間和下面提到的-T和-d 參數是有關系的,-T是多少,這個時間最大就是多少,
-d是多少,這個時間就一次增加幾,直到和-T的時間相等,就不變了。

過濾機制操作如下:
----------------------------------------------
依次鍵入:"f""a""u",然后轉入:".php",則過濾以.php結尾的URL

2:優化 Apache Prefork MPM
vi /etc/apache2/conf/extra/httpd-mpm.conf
---------------------------------------------------
指令                         說明                     
---------------------------------------------------
StartServers 控制Aapache啟動時將生成的客戶端數,由於創建客戶端有開銷,最好是擁有足夠的客戶端來處理空閑的流量.(默認值:5)
MinSpareServers 正常情況下,如果請求數減少並且Apache無法提供擁有這些請求的正常理由,則Apache會終止一些客戶端.該指令對Apaceh
將保持活動的客戶端數設置了一個較低的限制,它不應低於 StartServers(默認值:5)
MaxSpareServers 該指令設置Apache開始放棄客戶端的點.如果活動客戶端數比當前正在處理的並發請求數多10個以上,那么Apache將開始
終止和放棄客戶端,直到這個數量達到MinSpareServers值,該址設置得太低,會導致Apache封殺客戶端進程,因些小心使用此設置.(默認值:10)
MaxClients 該指令設置Apache將產生的最大進程數,從而設置它可以處理的最大同時並發請求數.(默認值:150)
MaxRequestsPerChild 該指令設置子進程在被終止和重新產生之前將處理的最大請求數.如果設置為0,則該進程是永久存在的,永遠不會死亡.(默認值:0)

3:優化內存使用和防止產生交換
一般經驗1G的內存最多可以支持65個並發請求.這里可以更改MaxClients為65便不會過渡的使用內存.
為了確保在負載上運行時不被封殺客戶端,大概應該將StartServers為了65的一半30左右.同時也將
MinSpareServers設置為30,再將MaxSpareServers設置為40,這是適當值可以防止封殺客戶端.

4:Aapche其它優化
a:盡可能是的禁用 .htaccess 文件, AllowOverride禁用
b:禁用 FollowSymlinks
c:DirectoryIndex 第一個文件應該指定使用最頻繁的文件
d:關閉HostnameLookup的DNS查找
e:啟用 Keep-Alive 的永久連接
f:使用 mod_deflate 來壓縮內容

5:負載均衡(將請求分發到多台服務器)
a:使用 Round-Robin DNS
b:使用負載均衡器,軟件一般有:LVS,mod_proxy 硬件:F5,CoyotePoint,Cisco,Juniper等.
c:負載均衡服務,Amazon Elastic Load Balancer等.

6:多服務器之間共享會話
a:Memcache
b:共享目錄文件(NFS等)
c:數據庫

7:服務器部署
多米諾骨牌失敗效應:假定一個由兩台服務器組成的服務器群,基於負載平均值和並發等,每台服務器的負載大概為其
容量的60%,這兩台服務器中的一台服務器發生故障會導致另一台試圖去處理總能力的120%的負載,從而引發它也會產生失敗.

所以設計一個服務器群集時必需要確保它可以容忍一個或多個服務器發生故障.如果只有兩台服務器,則必需監控其負載因子,
如果負載起過50%,則應該計划添加額外的服務器了.否則容易進入多米諾骨牌失敗效應.

多台服務器部署時,可以考慮為每台服務器設置一個內部的DNS域名為驗證,如 www1.demo.com,www2.demo.com 等.


[第八章  數據庫優化-MySql]
------------------------------------
MyISAM優點:
1:可以快速查詢唯一值
2:支持全文搜索
3:選擇Count(*)的速度很快
4:磁盤空間占用少
------------------------------------
MyISAM缺點:
1:表級別鎖,如果程序的寫入操作點總時間的5%以上,則表鎖會減慢程序的速度
2:不支持事務的能力
3:有持久性問題,表崩潰需要冗長的修復操作才可以恢復
----------------------------------

------------------------------------
InnoDB優點:
1:支持事務能力
2:具有行級的鎖定功能,並發寫入同一表時不會被序列化
3:支持多種聯機備份策略.
4:提高了程序在高負載,高並發下的能力.
------------------------------------
InnoDB缺點:
1:選擇count(*)很慢,它需要計算行.
2:沒有全文搜索.
3:自增字段必需是第一字段,在遷移時可能會導致問題.
4:點用更多的磁盤空間.
5:簡單的查表速度不如MyISAM,但復雜的,多個表的查詢速度則起過了MyISAM.
----------------------------------

選擇引擎的總結:
1:程序執行的大部分時間是讀操作(95%以上)則應該選擇MyISAM.
2:當事務性和一致性非常重要時,應該選擇InnoDB.
3:當你有一個包含很多連接表的復雜模式時.應該選擇InnoDB.
4:當不間斷操作非常重要時,如果全天24*7的運行,建議選擇InnoDB.

(Mysql內存使用比較)

每個連接(線程)使用的內存數量:
per_connection_memory = 
read_buffer_size                               // memory for sequential table scans 
+read_rnd_buffer_size                          // Memory for buffering reads 
+sort_buffer_size                              // Memory for in mem sorts 
+thread_stack                                  // Per connection memory 
+join_buffer_size                              // Memory for in mem table joins 

每服務器(固定)使用的內存數據:
per_server_memory = 
tmp_table_size                                 // memory for all temp tables 
+max_heap_table_size                           // max size of single temp table 
+key_buffer_size                               // memory allocated for index blocks 
+innodb_buffer_pool_size                       // main cache for InnoDB data 
+innodb_additional_mem_pool_size               // InnoDB record structure cache 
+innodb_log_buffer_size                        // log file write buffer 
+query_cache_size                              // compiled statement cache 

MySql可以使用的最大的內存定義如下:
max_memory = (per_connection_memory * max_connections) + per_server_memory


優化數據庫服務器的內存工具: Mysqltuner.pl

1:安裝
wget mysqltuner.pl -O mysqltuner.pl
chmod +x mysqltuner.pl
./mysqltuner.pl

(優化 InnoDB)
以下假設基於16G的內存:
innodb_file_per_table:
默認情況下,innodb為每個數據庫創建一個文件並用這個文件來管理數據表.這意味着如果表的大小先增大然后又縮小,
則很難恢復磁盤空間.設置了該值將使每個表使用一個獨立的數據存儲文件.如果想在現在的數據庫上更改此設置,應該
備份該數據庫,然后刪除它,再更改選項,然后新新啟動服務后從備份中恢復數據.
innodb_buffer_pool_size=:
如果只使用Innodb表,可以設置為可用內存的70%左右,如果混合使用了MyISAM,則要減小一點給MyISAM空間.
innodb_log_buffer_size=4M:
4M可以滿足絕大部分記錄的需求,面具提供合理的性能.如果擁有很大的文本字段或blob字段,或者記錄非常大的,可以設高點.
innodb_log_file_size=256M
這是推薦的值,可以在恢復數據庫的速度與操持較高的運行時性能之間取得良好的平衡.
innodb_flush_log_at_trx_commit=2
這一項控制日志文件刷新到磁盤的頻率.如果可以容忍在發生崩潰時丟失一些記錄,那么可以把它設為2來減少磁盤的寫入.
可選擇項: 0:每秒同步寫入 1:及時寫入 2:寫入緩存,由操作系統控制寫入

(記錄慢查詢)
[mysqld]
log-slow-queries=/var/log/mysql/mysqld-slow.log
long_query_time=1

(分析有問題的查詢)
explain 工具

(PHP數據庫應用程序的建議)
1:一開始就考慮使用 M/S 的讀寫方案,為以后的升級增加方便.
2:默認使用utf8的字符集,
3:使用UTC日期格式
3.1:安裝時區數據庫
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
[mysqld]
default-time-zone=UTC


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM