PHP服務緩存加速優化實戰
PHP服務緩存加速優化實戰:
(1)操作碼介紹及緩存原理:
當客戶端請求一個PHP程序的時候,服務器的PHP引擎會解析該PHP程序,並將其編譯為特定的操作碼(Operate Code)文件。
該文件是執行PHP代碼後的一種二進制表示形式。
默認情況下,這個編譯好的操作碼文件由PHP引擎執行後進行丟棄。
操作碼文件緩存機制就是將編譯還的文件保存下來,並放到共享內存中,以便於下一次調用該PHP頁面的時候重用它,避免了相同的代碼重復度,節省了PHP引擎重復編譯的時間。
降低了服務器負載,同時減少了服務器的CPU和內存的開銷。
LAMP環境PHP緩存加速器的原理:
在LNMP中,Apache服務是使用libphp5.so響應處理PHP程序請求的。
1.Apache服務接受客戶的PHP程序請求,並根據規則進行過濾。
2.Apache將PHP程序請求傳遞給PHP處理模塊libphp5.so。
3.PHP引擎定位磁盤上的PHP文件,並將其加載到內存中解析。
4.PHP處理模塊libphp5.so將PHP源碼編譯成opcode。
5.Apache接收客戶端新的PHP請求,PHP編譯解析並將結果返回。
LNMP環境PHP緩存加速器的原理:
在LNMP中不再使用libphp5.so模塊了,而是啟動獨立的FCGI進程,就是php-fpm,由它來監聽來自Nginx的PHP程序請求,交給PHP引擎進行處理。
1.Nginx接收客戶端的PHP程序訪問請求。
2.Nginx根據擴展名等過濾規則進行將PHP程序傳遞給解析PHP程序的FCGI進程。
3.PHP FPM進程調用PHP解析器讀取磁盤上的PHP文件,並加載到內存中。
4.PHP解析器將PHP程序編譯成為opcode文件,然後把opcode緩存起來。
5.PHP FPM引擎執行opcode樹後,返回數據給Nginx,進而返回客戶端。
6.Nginx接收新的客戶端請求,PHP FPM引擎就會直接讀取緩存起來的opcode並執行。
7.將結果返回。
PHP加速軟件的選擇:
PHP緩存加速器軟件常見的有XCache、eAccelerator、APC(Alternative PHP Cache)、ZendOpcache等。
首選Xcache,其次是eAccelerator。
原因:
1.經過測試,XCache效率更高,速度更快。
2.XCache軟件開發社區更加活躍。
3.支持更高的PHP版本
4.eAccelerator安裝及配置相對簡單,加速效果明顯。
5.eAccelerator文檔資料比較多,但是官方對軟件的更新速度比較慢,社區不活躍。
6.eAccelerator僅僅適合PHP 5.4以下的版本。
7.ZendOpcache是PHP官方研發的新一代緩存加速軟件,以後可能會有更好的發展前景。
8.從PHP5.5開始ZendOpcache開始整合到PHP軟件中,以前都是以插件的方式進行安裝的。
9.在PHP5.5以後的版本中使用--enable-opcache。
10.ZendOpcache可能是未來緩存的首先選擇。
在使用緩存的時候需要準備LNMP環境。
(1)安裝XCache緩存加速模塊:
cd ./xcache-3.2.0
/app/php/bin/phpize
./configure --enable-xcache --with-php-config=/app/php/bin/php-config
make
make test
make install
ll /app/php-5.4.24/lib/php/extensions/no-debug-non-zts-20100525/
total 680
-rwxr-xr-x. 1 root root 695580 Sep 17 14:06 xcache.so
(2)安裝eAccellerator緩存加速模塊:
tar -zxvf ./eaccelerator-eaccelerator-42067ac.tar.gz
cd ./eaccelerator-eaccelerator-42067ac
/app/php/bin/phpize
./configure --enable-eaccelerator=shared --with-php-config=/app/php/bin/php-config
make && make install
ll /app/php-5.4.24/lib/php/extensions/no-debug-non-zts-20100525/
total 1108
-rwxr-xr-x. 1 root root 438090 Sep 17 14:14 eaccelerator.so
(3)安裝ZendOpcache緩存加速模塊:
tar -zxvf ./zendopcache-7.0.5.tgz
cd ./zendopcache-7.0.5
/app/php/bin/phpize
./configure --enable-opcache --with-php-config=/app/php/bin/php-config
make && make install
ll /app/php-5.4.24/lib/php/extensions/no-debug-non-zts-20100525/
total 1636
-rwxr-xr-x. 1 root root 539488 Sep 17 14:18 opcache.so
(4)安裝PHP Memcached擴展插件:
Memcached是一個開源的支持高性能、高並發及分布式的內存緩存服務軟件。
分為客戶端和服務器端:
客戶端:Memcache
服務器端:Memcached
在傳統場景下,多數Web應用都將數據保存到RDBMS中,www服務器從中讀取數據並在瀏覽器中顯示。
但是隨著數據量的變大,訪問的集中,就會出現RDBMS的負擔加重,數據庫響應速度變慢,網站延遲等問題。
Memcached是高性能的分布式內存緩存服務。
使用Memcached的主要目的就是通過自身內存中緩存數據庫的查詢結果,減少數據庫訪問次數,以提高動態Web應用速度,提高網站架構的並發能力和擴展性。
Memcached服務通過在事先規劃好的系統空間中面臨緩存數據庫中各類數據,以達到減少前端業務對數據庫的直接高並發訪問,從而提升大規模網站集群中動態服務的並發訪問能力。
生產場景中,Memcached服務一般被用來保存網站中經常被讀取的對象或數據。
Memcached的工作流程:
1.程序首先檢查客戶端請求的數據在Memcached服務的緩存中是否存在,如果存在,會直接將請求的數據返回,不再請求後端的數據庫。
2.如果請求的數據在Memcached的緩存中不存在,程序會去Memcached後端的數據庫服務。
3.把數據從數據庫中返回到客戶端中。
4.同時把新的數據保存在Memcached服務緩存中,下次直接請求Memcached中的數據。
為PHP安裝Memcache客戶端:
tar -zxvf ./memcache-2.2.5.tgz
cd ./memcache-2.2.5
/app/php/bin/phpize
./configure --enable-memcache --with-php-config=/app/php/bin/php-config
ll /app/php-5.4.24/lib/php/extensions/no-debug-non-zts-20100525/
-rwxr-xr-x. 1 root root 259088 Sep 17 16:00 memcache.so
安裝報錯解決:
make:***[memcache.lo]Error 1
解決:
cp memcache.loT memcache.lo
(5)安裝PDO_MYSQL擴展模塊:
PDO擴展為PHP訪問數據庫定義了一個輕量級的一致性接口,它提供一個數據訪問抽象層。
這樣五龍輪使用什麽數據庫都可以使用統一的函數進行數據查詢並獲取數據。
PDO_MYSQL可以使用插件安裝或編譯PHP的時候加入參數,使用--with-pdo-mysql=mysqlnd直接加入PDO_MYSQL的PHP支持。
使用--with-mysql-mysqlnd即可在沒有MySQL的環境下使PHP支持MySQL數據庫。
tar -zxvf ./PDO_MYSQL-1.0.2.tgz
cd ./PDO_MYSQL-1.0.2
/app/php/bin/phpize
./configure --with-php-config=/app/php/bin/php-config --with-pdo-mysql=/app/mysql
make && make install
安裝報錯解決:
make: *** [pdo_mysql.lo] Error 1
解決:
cp pdo_mysql.loT pdo_mysql.lo
make: *** [mysql_driver.lo] Error 1
解決:
cp mysql_driver.loT mysql_driver.lo
make: *** [mysql_statement.lo] Error 1
解決:
cp mysql_statement.loT mysql_statement.lo
ll /app/php-5.4.24/lib/php/extensions/no-debug-non-zts-20100525/
-rwxr-xr-x. 1 root root 5429 Sep 17 16:35 pdo_mysql.so
(6)安裝imagick模塊:
ImageMagick是一套功能強大,穩定而且免費的工具集和開發包,可以用來讀寫和處理超過89種。
利用根據Web應用程序的需要動態生成圖片,還可以對一個或一組圖片進行改變大小等操作。
同時ImageMagick提供一個高質量的2D工具包。
部分支持SVG。
它甚至包括各種曲線的渲染功能。
tar -zxvf ./ImageMagick-i686-pc-mingw32.tar.gz
cd ./ImageMagick-6.8.5/
./configure && make && make install
(7)安裝imagick PHP擴展模塊:
要先安裝ImageMagick模塊才可以安裝imagick PHP模塊。
imagick插件是提供PHP調用ImageMagick功能的擴展模塊。
安裝ImageMagick圖像程序後,再安裝PHP的擴展imagick插件,才可以用ImageMagick提供的API進行圖片創建、壓縮與修改。
ln -s /usr/local/include/ImageMagick-7/ /usr/local/include/ImageMagick
tar -zxvf ./imagick-2.3.0.tgz
cd ./imagick-2.3.0
/app/php/bin/phpize
./configure --with-php-config=/app/php/bin/php-config
配置PHP Memcache/PDO_MYSQL/imagick模塊:
編輯php.ini文件:
extension=/app/php-5.4.24/lib/php/extensions/no-debug-non-zts-20100525/
檢查配置文件:
grep "extension_dir=" /app/php/lib/php.ini
extension=/app/php-5.4.24/lib/php/extensions/no-debug-non-zts-20100525/
extention = pdo_mysql.so
extettion = memcache.so
extention = imagick.so
(8)配置eAccelerator插件生效並優化參數:
mkdir /tmp/eaccelerator
chown nginx.nginx /tmp/eaccelerator/
ll -d /tmp/eaccelerator/
drwxr-xr-x. 2 nginx nginx 4.0K Sep 17 20:26 /tmp/eaccelerator/
這個目錄可以使用tmpfs或SSD來存儲。
配置PHP參數:php.ini
[eaccelerator]
extension = eaccelerator.so
eaccelerator.shm_size="64"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_tt1="3360"
eaccelerator.shm_prune_period="3360"
eaccelerator.hsm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
檢查PHP配置文件:
[[email protected] ~]# tail -15 /app/php/lib/php.ini
[eaccelerator] #加載模塊文件配置
extension = eaccelerator.so #加載模塊
eaccelerator.shm_size="64" #存儲緩存數據的共享內存大小,如果是0,則最大值看內核/proc/sys/kernel/shmmax
eaccelerator.cache_dir="/tmp/eaccelerator" #磁盤緩存存儲路徑,緩存內容precompiled code、session data、contect、user entires。默認路徑是/tmp/eaccelerator
eaccelerator.enable="1" #eAccelerator緩存生效開關,默認為1,表示開啟。
eaccelerator.optimizer="1" #加速PHP代碼執行速度,默認為1,表示激活。用於緩存前的代碼加速。
eaccelerator.check_mtime="1" #檢查緩存修改時間,決定代碼是否需要重新編譯,默認值為1,表示激活。
eaccelerator.debug="0" #緩存加速調試,打開後可以看到緩存中的信息。
eaccelerator.filter="" #設定對象是否緩存規則,空表示不設定。
eaccelerator.shm_max="0" #可以被放置的緩存最大值,不限制為0.
eaccelerator.shm_tt1="3360" #緩存文件的生存期
eaccelerator.shm_prune_period="3360" #當共享內存時間不夠的時候,從共享內存中移除舊的數據的時間周期。
eaccelerator.hsm_only="0" #是否允許緩存數據到磁盤,允許為0,但是對於session data and contect caching無影響。
eaccelerator.compress="1" #是否開啟壓縮,開啟為1。
eaccelerator.compress_level="9" #壓縮級別,最高為9。
#可選值
eaccelerator.keys="shm_and_disk" #控制keys的緩存位置
eaccelerator.sessions="shm_and_disk" #控制sessions的緩存位置
eaccelerator.content="shm_and_disk" #控制內容緩存位置
查看eAccelerator的加速情況:
/app/php/sbin/php-fpm -v
PHP 5.4.24 (fpm-fcgi) (built: Sep 17 2017 12:21:41)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
with eAccelerator v1.0-dev, Copyright (c) 2004-2012 eAccelerator, by eAccelerator
測試/tmp/eaccelerator/目錄下存在緩存數據。
配置XCache插件加速:
編輯php.ini:
;[xcache]
[xcache-common]
extension = xcache.so
[xcache.admin]
xcache.admin.enable_auth = On
xcache.admin.user = "mOo"
xcache.admin.pass = "md5 encrypted password"
[xcache]
xcache.shm_scheme = "mmap"
xcache.size = 256M
xcache.count = 2
xcache.slots = 8K
xcache.ttl = 86400
xcache.gc_interval = 3600
xcache.var_size = 64M
xcache.var_count = 1
xcache.var_slots = 8K
xcache.var_ttl = 0
xcache.var_gc_interval = 300
xcache.var_namespace_mode = 0
xcache.var_namespace = ""
xcache.readonly_protection = Off
xcache.mmap_path = "/dev/zero"
xcache.coredump_directory = ""
xcache.coredump_type = 0
xcache.disable_on_crash = Off
xcache.experimental = Off
xcache.cacher = On
xcache.stat = On
xcache.optimizer = Off
[xcache.converager]
xcache.coverager = Off
xcache.coverager_autostart = On
xcache.coveragedump_directory = ""
檢查PHP的XCache加速緩存情況:
/app/php/bin/php -v
PHP 5.4.24 (cli) (built: Sep 17 2017 12:21:30)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
with XCache v3.2.0, Copyright (c) 2005-2014, by mOo
with XCache Cacher v3.2.0, Copyright (c) 2005-2014, by mOo
配置文件詳解:
;[xcache] XCache配置文件解析開始
[xcache-common]
extension = xcache.so 包含加速模塊,路徑相對於extension_dir的配置,自3.0開始不再支持使用zend_extension加載xcache的方式。
[xcache.admin] 管理員配置開始
xcache.admin.enable_auth = On 激活管理員認證
xcache.admin.user = "mOo" 指定xcache的管理員用戶名
xcache.admin.pass = "md5 encrypted password" 指定xcache的管理員密碼
[xcache] XCache配置開始
xcache.shm_scheme = "mmap" 設置XCache如何從系統分配共享內存
xcache.size = 256M 禁止緩存為0,啟用緩存為非零數字,需要註意系統所允許的mmap最大值
xcache.count = 2 指定將XCache切分多少塊,官方推薦設置為服務器CPU的數量
xcache.slots = 8K hash槽個數的參考值,緩沖超過此數值時,也沒有任何問題。
xcache.ttl = 86400 設定cache對象的生存周期TTL,永不過期是0
xcache.gc_interval = 3600 回收器掃描過期回收內存空間的間隔,不掃描為0,其他數值的單位是秒,默認是0
xcache.var_size = 64M 用於變量緩存,而不是opcache緩存
xcache.var_count = 1 用於變量緩存,而不是opcache緩存
xcache.var_slots = 8K 用於變量緩存,而不是opcache緩存
xcache.var_ttl = 0 用於變量緩存,而不是opcache緩存
xcache.var_gc_interval = 300 用於變量緩存,而不是opcache緩存
xcache.var_namespace_mode = 0 如果啟用了還參數,將會稍微降低性能,但是會提高一定的系統安全性。對xcache.mmap_path = "/dev/zero"無效
xcache.var_namespace = ""
xcache.readonly_protection = Off
xcache.mmap_path = "/dev/zero" 對於*nix,xcache.mmap_path 是一個文件路徑而非目錄。如果要啟用該參數,請使用/tmp/xcache這樣的參數。
如果開啟了xcache.readonly_protection參數,不同進程組的PHP將不會共享一個/tmp/xcache路徑。
xcache.coredump_directory = "" 當XCache崩潰後,是否把數據保存到指定路徑
xcache.coredump_type = 0
xcache.disable_on_crash = Off 當XCache發生崩潰後,自動關閉XCache的路徑
xcache.experimental = Off
xcache.cacher = On
xcache.stat = On
xcache.optimizer = Off
[xcache.converager]
xcache.coverager = Off
xcache.coverager_autostart = On
xcache.coveragedump_directory = ""
查看CPU參數:
more /proc/cpuinfo
processor: 0
vendor_id: GenuineIntel
cpu family: 6
model: 69
model name: Intel(R) Core(TM) i3-4030U CPU @ 1.90GHz
stepping: 1
microcode: 29
cpu MHz: 1900.000
cache size: 3072 KB
physical id: 0
siblings: 1
core id: 0
cpu cores: 1
apicid: 0
initial apicid: 0
fpu: yes
fpu_exception: yes
cpuid level: 13
wp: yes
flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc up
arch_perfmon pebs bts xtopology tsc_reliable nonstop_tsc aperfmperf unfair_spinlock pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadli
ne_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm arat epb xsaveopt pln pts dtherm tpr_shadow vnmi ept vpid fsgsbase bmi1 avx2 smep bmi2 invpcid
bogomips: 3800.00
clflush size: 64
cache_alignment: 64
address sizes: 42 bits physical, 48 bits virtual
power management:
配置web管理界面:
mkdir /app/nginx/html/blog/xcache
cp -a /tools/xcache-3.2.0/htdocs/ /app/nginx/html/xcache/
chown -R nginx.nginx /app/nginx/html/xcache/
創建XCache web配置文件
vim /app/nginx/conf/extras/xcache.conf
server {
listen 8088;
server_name inner.myxcache.com;
#location / {
# root html;
# index index.html index.htm;
#}
location / {
root html/xcache;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include ../conf/fastcgi.conf;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
通過md5sum生成管理員密碼:
echo "123456" | md5sum
e10adc3949ba59abbe56e057f20f883e -
修改php.ini文件:
xcache.admin.user = "xcacheadmin"
xcache.admin.pass = "e10adc3949ba59abbe56e057f20f883e"
重啟php-fpm。
重啟Nginx。
訪問http://inner.myxcache.com/可以進入管理頁面。
配置ZendOpcache插件加速:
vim /app/php/lib/php.ini
[opcache]
zend_extension=/app/php-5.4.24/lib/php/extensions/no-debug-non-zts-20100525/opcache.so
opcache.memory_consumption=32
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=1000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
重啟php-fpm進程:
訪問:http://192.168.1.111:8080/view_phpinfo.php
view_phpinfo.php文件代碼:
<?php
phpinfo();
?>
參數講解:
[opcache] ZendOpcache配置開始
zend_extension=/app/php-5.4.24/lib/php/extensions/no-debug-non-zts-20100525/opcache.so 加載模塊文件
opcache.memory_consumption=32 ZendOpcache共享內存的大小,用於存放precompiled PHP code,默認是64,單位是Mbytes
opcache.interned_strings_buffer=8 默認是4,interned_strings內存的數量,單位值MB
opcache.max_accelerated_files=1000 默認是2000,ZendOpcache散列表的key的最大數量
opcache.revalidate_freq=60 默認是2,檢查文件時間戳的頻率,用於共享內存分配的變化
opcache.fast_shutdown=1 默認是0,如果激活,一個快速的關閉隊列將被用來加速代碼
opcache.enable_cli=1 默認是0,激活PHP CLI的ZendOpcache,用於測試和調試
在PHP5.5以上的版本中只需要編譯PHP的時候指定--enable-opcache即可使用ZendOpcache。
生產環境PHP插件安裝建議:
eAccelerator-0.9.5.2.tar.gz適合PHP5.3及以前的版本,緩存加速使用 可選的PHP擴展插件。
eAccelerator-0.9.6.tar.bz2適合PHP5.3版本,PHP緩存加速,可選的PHP擴展插件。
ImageMagick.tar.gz常用圖像處理程序,屬於功能應用,非PHP擴展插件。
imagick-2.3.0.tgz需要先安裝圖像處理程序,屬於應用功能,可選的PHP擴展插件。
memcache-2.2.7.tgz是memcache客戶端數據庫緩存優化應用,可選的PHP擴展插件。
PDO_MYSQL-1.0.2.tar.gz是PHP數據庫庫訪問插件,屬於PHP功能插件,可選的PHP擴展插件。
xcache-3.2.0.tar.bz2支持PHP5.1~PHP5.6緩存加速,可選PHP擴展插件。
zendopcache-7.0.5.tar.gz支持PHP5.3~PHP5.4緩存加速,可選的PHP擴展插件。
生產環境插件安裝建議:
對於功能性插件:
如果業務不需要使用,可以不考慮安裝。
如果不清楚是否需要安裝,最好安裝上。
對於性能優化插件:
eAccelerator、XCache、ZendOpcache、APC可以安裝其中任何一種。
具體情況看業務需求。最好進行壓力測試。
PHP加速插件性能測試對比:
eAccelerator在請求時間和內存占用綜合方面是最好的。
存在加速器比不存在加速器在請求時間方面快3倍。
什麽是phpize?
安裝PHP擴展的時候需要phpize,phpize是用來擴展PHP擴展模塊的。
通過phpize可以建立PHP的外掛模塊。
編譯PHP後,在bin目錄下會有phpize這個腳本文件,再要添加模塊的目錄下執行這個腳本後出現一個configuer文件。
./configuer後面可以很--with-php-config的文件路徑。
在PHP指定編譯時指定了--with-mysql=mysqlnd和--with-pdo-mysql=mysqlnd的參數,在生產環境中可能會有socket連接問題。
解決方法時在php.ini中加入:
pdo_mysql.default_socket=/app/php/tmp/mysql.sock
本文出自 “泡面、車庫、程序員” 博客,請務必保留此出處http://xvjunjie.blog.51cto.com/12360960/1967166
PHP服務緩存加速優化實戰