php的優化有這麼幾個方向
主要時靈活、廣泛支援、模組方式等有點。因為apache實在程序內部解析大多數指令碼語言的,所以沒有軟體間通訊的開銷。apache處理請求的模式有三種:prefork模式(執行緒建立程序)、worker模式(程序建立執行緒)、事件驅動模式(與worker模式類似,但這種模式會為連線保持建立專用線程,活動請求使用另外建立的執行緒),因此它能提供更好的靈活度。每乙個請求都會由乙個執行緒或程序處理,所以apache在處理請求時開銷很大。當它在高併發場景的時候,其效能低下的問題便會凸顯。
它提供了非同步、事件驅動、非阻塞請求處理。由於請求非同步處理,所以nginx不必等待每個請求完成,避免鎖住資源。
nginx建立許多任務作程序,每個工作程序可以處理數千個連線,因此可以使用很少的程序來承載高併發流量。
nginx沒有內建任何解釋型語言,如此,nginx便可以專注於處理請求的接收與相應。而具體解析指令碼語言的程序則在nginx之外。
通常我們認為nginx要快於apache,但在一些場景下,例如靜態資源下,apache也有自己的優勢。在構建高效能伺服器時,apache並不是問題所在,php才是真正的瓶頸。
在apache中快取靜態內容
header set cache-control "max-age=604800, publilc"
上邊的內容需要被配置在.htaccess檔案中,使用apache的filesmatch命令來匹配相應的檔案的副檔名。如果檔案被匹配到,apache將新增頭資訊,以標識這類檔案可以被使用者端裝置快取7天,瀏覽器發現這樣的頭資訊後便會快取檔案,在這個例子中瀏覽器會快取7天。
location ~* .(ico|jpg|jpeg|png|gif|css|js|woff)$
nginx同樣會在匹配到的相應靜態檔案時新增對應的頭資訊。
開啟keep alive有兩種方式,分別時修改.htaccess和修改apache配置檔案
.htaccess
header set connection keep-alive
配置檔案,三個選項都需要修改
keepalive on
maxkeepaliverequests 100
keepalivetimeout 100
maxkeepaliverequests限制了keep-alive在同一時刻的最大連線數。100時預設配置,可以自行修改。如果設定為0,apache將不對keep-alive的連線數進行限制。
keepalivetimeout通常設定為100秒,如果對於同一長連線,apache等了100秒還未收到下一條請求,便會主動斷開。
http請求的keep-alive是由nginx的http_core模組支援的,預設情況下是開啟的。
keepalive_requests 100
keepalive_timeout 100
keepalive_requests定義了單個客戶端在一條長連線鏈路上可以同時發起的請求數,keepalive_timeout定義了長連線的超時時間,超過了這個時間後,nginx會斷開長連線。
依然是修改.htaccess
setoutputfilter defalte
#新增需要進行過濾的檔案型別
#不壓縮
setenvifnocase request_uri \.(?:gif|jpe?g|png) $ no-gzip dont-vary
上述配置中,apache deflate模組開啟壓縮,通過配置檔案型別過濾器,對.html、.xml、.css、.js等檔案進行內容輸出前的壓縮,這裡沒有設定的壓縮處理,因為壓縮後的質量會受到很大影響。
gzip on;
gzip_vary on;
gzip_com_level 4;
gzip開啟後,之後的gzip_vary on將會啟用varying頭。gzip_com_level表明壓縮等級,此處的值最好斟酌斟酌,不宜太高,取值區間是1-9,建議設定中間值。
篩選技巧:先將所有的模組禁用並重啟伺服器,然後逐個開啟並檢查應用程式是否執行正常
獲得載入的所有模組的列表
apachectl -m
列出開啟的模組
nginx -v
通常情況下,nginx僅開啟了所需的模組進行工作
伺服器最大的問題當屬ram了
nginx提供了兩個變數worker_processes、worker_connections來適應資源情況,worker+processes設定決定著可以有多少nginx程序被執行。一般乙個程序執行在乙個cpu上時比較合適的。worker_connections配置決定了這乙個程序中同時可以處理的鏈結數。這裡的配置取決於物理核數。
ulimit -n
執行這個命令後顯示的數值,就可以作為worker_connections配置的設定值。
如果不經常更改,可以根據情況修改後清除快取
是指根據每個web伺服器的負載情況,將外網流量以一定的規則分發給web伺服器。
對於負載均衡,可以使用廣泛運用的haproxy。它會檢查每個web伺服器的執行狀況,如果web伺服器關閉,它會自動將此web伺服器的流量重定向到其他可用的web伺服器上,為此,只有lb會監聽80埠。
我們不想將外部的ssl請求傳遞到web伺服器,那樣會加重web伺服器的負載,因此需要在haproxy伺服器上終結ssl。當lb收到帶有ssl的請求時候,將轉換ssl請求並向其中的乙個web伺服器傳送正常請求。當haproxy接收到相應時,它將加密相應並將其傳送回客戶端。這樣就不會讓兩個web伺服器同事進行ssl加密/解密,只有乙個lb在做這件事。
apt install haproxy
準備三颱伺服器
web1與web2被稱為後端伺服器,在這裡先配置lb伺服器的監聽80埠,開啟haproxy.cfg配置檔案,一般位於/etc/haproxy目錄下,新增配置:
server web2 111.111.111.3:9999 check後端的引用名是web-backend,它也在前段配置中使用。在每個web伺服器的定義結束時都是用check配置項,告訴haproxy檢查伺服器的執行狀況,之後重啟haproxy
service haproxy restart
現在,在瀏覽器中輸入lb伺服器的ip或主機名,web應用程式頁面將從web1或web2獲取資料並顯示出來。
haproxy還提供了乙個通過瀏覽器檢視stats頁面,該頁面可以顯示關於lb和所有後端的完整狀態資訊。要啟用stats,需要修改haproxy.cfg:
listen stats *:1434
stats enable
stats uri /haproxy-stats
stats auth phpuser:password
stats服務執行在1434埠上,這個埠可以任意配置,uri資訊也可以任意設定。auth資訊用於基本的web驗證,可以隨意設定,設定後請儲存並重啟haproxy,就可以進入stats頁面。
最後,要使用haproxy轉換ssl也很簡單,新增ssl繫結443埠並且制定ssl證書的位置。開啟haproxy.cfg:
bind *:443 ssl crt /etc/ssl/www.***.crt #加入這一行
default_backend web-backends重啟haproxy,此時haproxy開始監聽443,當ssl請求傳送到haproxy時,會在內部做好轉換,所以https請求不會被傳送到後端伺服器。這樣,ssl加密/解密環節就可以從web伺服器中刪除,並且僅由haproxy伺服器管理。由於ssl在haproxy伺服器處轉換,因此web伺服器無需再監聽443埠,因為接收到的請求都是來自haproxy的傳統http請求。
php7效能提公升的原因詳解
為什麼php7的效能可以提高這麼多?1.jit 2.zval的改變 3.內部型別zend string 4.php陣列的變化 hashtable和zend array 5.函式呼叫機制 f程式設計客棧unction calling convention 6.通程式設計客棧過巨集定義和內聯函式 inl...
提公升企業級Flex應用效能
0.使用module和rsl 1.能定義成static靜態的盡量定義為靜態,能定義為常量的盡量定義為常量,常量比變數快 2.不要embed大的和資源,像傳統web一樣使用url來獲取 3.盡可能不使用變數bind ui 3.顯示慢的介面控制項改為絕對位置和固定寬高,盡量採用canvas作為容器,減少...
分享五個PHP7效能優化提公升技巧
1.opcache 記得啟用zend opcache,因為php7即使不啟用opcache速度也比php 5.6啟用了opcache快,所以之前測試時期就發生了有人一直沒有啟用opcache的事情.啟用opcache非常簡單,在php.ini配置檔案中加入 zend extension opcach...