php性能優化配置

1.php.ini之opcache配置php

opcache.enable=1;//開啓opcache緩存php操做碼提升運行效率
opcache.memory_consumption=64;//爲操做碼緩存分配的內存大小,視腳本的數量而定
opcache.interned_strings_buffer=16;//用來存儲駐留字符串的內存量,默認狀況PHP解釋器會從各個PHP進程中找到相同字符串的指針,若是存在則使用已有的字符串指針。開啓該項配置能夠從各個進程中集中到共享的緩衝區,以節省更多內存。
opcache.max_accelerated_files=32531;//OPcache 哈希表中可存儲的腳本文件數量上限,應大於項目腳本文件數
opcache.validate_timestamps=0;//是否檢測腳本內容發生變化,生產環境建議設置爲0(PS:每次更新代碼記得手動重置下緩存 opcache_reset),開發環境設置爲1.
opcache.revalidate_freq=0;//當opcache.validate_timestamps設置爲0時該配置項沒有任何意義。
opcache.fast_shutdown=1;//啓用,則會使用快速中止續發事件。 所謂快速中止續發事件是指依賴 Zend 引擎的內存管理模塊 一次釋放所有請求變量的內存,而不是依次釋放每個已分配的內存塊。從 PHP 7.2.0 開始,此配置指令被移除。 快速中止的續發事件的處理已經集成到 PHP 中, 只要有可能,PHP 會自動處理這些續發事件。


14.15開啓opcache負載從0.03降低到0.01html

a.清空opcachemysql

1.適合cli模式nginx

<?php
if(function_exists('opcache_reset')){
    opcache_reset();
}

2.適合php-fpm服務下的應用(更多信息見:http://gordalina.github.io/cachetool/)git

curl -sO http://gordalina.github.io/cachetool/downloads/cachetool.phar
chmod +x cachetool.phar
php cachetool.phar opcache:reset --fcgi=/dev/shm/php-fpm.socket

 

2.php-fpmgithub

[global]
pid = /tmp/php-fpm.pid
error_log = /data/logs/php/php-fpm.log
log_level = notice
emergency_restart_threshold = 60;在emergency_restart_interval設置的時間跨度內,若是失效的php-fpm子進程數超過這個值,php-fpm主進程就重啓
emergency_restart_interval = 1m;設定emergency_restart_threshold設置採用的時間跨度
process_control_timeout = 10s;設置子進程接受主進程複用信號的超時時間。參考:https://segmentfault.com/q/1010000007053797
[www]
;能夠記錄日誌方便找問題
;access.log = /data/logs/php/access.log
pm.status_path = /phpstatus
user = www
group = www
listen = /dev/shm/php-fpm.socket
listen.mode = 0666
listen.owner = www
listen.group = www
listen.allowed_clients = 127.0.0.1
listen.backlog = 8096;//根據狀況來配置默認是-1依據系統來分配。手動設置應是2的倍數
pm = dynamic;參考https://www.jianshu.com/p/c9a028c834ff dynamic適合內存比較少的狀況
pm.max_children = 50
pm.start_servers = 25;=pm.min_spare_servers+(pm.max_spare_servers-pm.min_spare_servers)/2
pm.min_spare_servers = 20
pm.max_spare_servers = 30
pm.max_requests = 1024;若是你的請求流量很平均(按時間)會致使全部的子進程在短期內一塊兒重啓致使服務器性能波動和短暫的502,這樣子能夠建議不配置該參數,可是會一每天吃掉你的內存!
request_slowlog_timeout = 3
request_terminate_timeout = 300
catch_workers_output = yes
slowlog = /data/logs/php/php-fpm.log.slow
rlimit_files = 65535

pm.max_chindren詳解:sql

pm.max_chindren,進程多了,增長進程管理的開銷以及上下文切換的開銷。更核心的是,能併發執行的 php-fpm 進程不會超過 cpu 個數。
如何設置,取決於你的代碼
若是代碼是 CPU 計算密集型的,pm.max_chindren 不能超過 CPU 的內核數。
若是不是,那麼將 pm.max_chindren 的值大於 CPU 的內核數,是很是明智的。
國外技術大拿給出這麼個公式:
在 N + 20% 和 M/m 之間。
N 是 CPU 內核數量。
M 是 PHP 能利用的內存數量。
m 是每一個 PHP 進程平均使用的內存數量。
適用於 dynamic 方式。
static方式:M/(m * 1.2)
固然,還有一種保險的方式,來配置 max_children。適用於 static 方式。
先把 max_childnren 設置成一個比較大的值。
穩定運行一段時間後,觀察 php-fpm 的 status 裏的 max
active processes 是多少
而後把 max_children 配置比它大一些就能夠了。
pm.max_requests:指的是每一個子進程在處理了多少個請求數量以後就重啓。

引用自http://xiaohost.com/2614.html

我的看法:pm.max_chindren=(可用內存-(mysql、nginx等其餘核心服務所需的內存))/(每一個php進程所需內存*1.5)

3. php.ini之文件上傳segmentfault

file_uploads =1
upload_max_filesize=10M;文件最大尺寸,改變該值記得驗證nginx的client_max_body_size設置
max_file_uploads=3;單次請求最多3個文件

4.php.ini最長執行時間瀏覽器

max_execute_time=5;設置單個php進程在終止以前最長能夠運行多少時間,建議不超過10s。長時間任務建議交給cli

5.php.ini之日誌配置緩存

display_startup_errors=on;//生產環境Off
display_errors=On;生產環境Off
error_reporting=-1;報告全部錯誤 生產環境E_ALL & ~E_NOTICE
log_errors=On;記錄錯誤

6.php.ini之處理會話

session.save_handler='memcached'
session.save_path='127.0.0.1:11211'

7.php.ini緩衝輸出

output_buffering=4096;32位系統是4的倍數64位系統是8的倍數
implicit_flush=false

8.php.ini之真實路徑緩存(使用了大量文件,增長PHP真實路徑緩存的大小能獲得更好的性能)

realpath_cache_size=64k;設置技巧先設置一個比較大的值256k而後在腳本結尾加上print_r(realpath_cache_size())獲取真實大小

9.網絡鏈接優化

經過ss -s的closed和timewait指標來看是否鏈接創建是否正常,若是數值較大能夠考慮作如下修改

/proc/sys/net/core/somaxconn全鏈接上限

/proc/sys/net/ipv4/tcp_max_syn_backlog半鏈接上限

nginx的backlog

php-fpm的listen.backlog

如下是參考配置cat /etc/sysctl.conf

net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time=1800
net.ipv4.tcp_max_syn_backlog=8192
net.netfilter.nf_conntrack_max = 655350
net.netfilter.nf_conntrack_tcp_timeout_established = 120

10.nginx的ssl優化,我的經驗開啓緩存能夠減小大量ssl握手的時間

ssl on;
ssl_certificate lvtao.net.crt; #公鑰
ssl_certificate_key lvtao.net.key;#私鑰
ssl_session_cache shared:SSL:20m; #緩存池  緩存大小設置爲 20M,大概能放下 80000 個會話
ssl_session_timeout  10m;  #緩存時間
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #只啓用 TLS 系列協議
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE:!kEDH;#按照這個套件配置
#完整參考 ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-RC4-SHA:ECDHE-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:RC4-SHA:HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!CBC:!EDH:!kEDH:!PSK:!SRP:!kECDH;
ssl_prefer_server_ciphers on;
#可選 如下三行 啓用 OCSP  可讓瀏覽器更快的獲取證書撤銷狀態
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/startssl_trust_chain.crt; 
#啓用 HSTS 用於通知瀏覽器強制使用 https 通訊。要求瀏覽器對用戶明文訪問的Url重寫成HTTPS,避免了始終強制302重定向的延時開銷
add_header Strict-Transport-Security "max-age=31536000";
相關文章
相關標籤/搜索