背景:部署一套PHP微服務接口,須要兼顧性能,開發效率,擴展性。權衡後選擇了CodeIgniter;同時優化框架的默認啓動項,在qps1000+的壓力下整個
啓動時間優化到5ms
左右。php
背景:使用php做爲微服務的接口,具備必定的性能要求和併發要求。html
方案:mysql
1:選一個輕量的php框架。具備簡單高效的路由,模塊化便可。nginx
2:在框架的基礎上,自定義的優化laravel
從如下幾個角度作了簡單的比較git
https://www.ruilog.com/blog/v...github
列舉了不少數據,除了直接寫php以外,ci和lumen的併發和性能不錯,在考慮範圍內。web
github排名前四的是laravel,symfony,ci,yii2。最火的是laravel毋庸置疑。但前四均在考慮範圍內sql
laraval,ci,yii的中文社區都還不錯。數據庫
綜合考慮以後,在知足功能的狀況下,選擇性能最好,也易入手的codeIgniter做爲基礎框架。(整個包才2.5M,刪除了web文件夾後更小
)
框架的基本部署,直接參考官網:https://codeigniter.org.cn/
配置了數據庫以後,添加了一個默認的controller,一個model,默認加載時間居然30ms+—_-。瞬間懵逼了,nginx+fpm也就1-2ms,框架居然30ms,確定那裏配置錯了,決定沿着路由追一下。
沿着ci的路由順序追查,從index入,一步一步卡時間。[括號內爲運行到的總計數
]
-》index.php [1ms
]
-》core/CodeIgniter.php
-》加載常量[1ms
]
-》加載common(包括log,show,error,is_https等)[1ms]load hooks [2ms
]
-》加載autoload 方法
-》加載benchmark
-》實例化hooks
-》實例化pre_controller
-》實例化post_controller_constructor
-》實例化post_controller
-》實例化post_system
-》加載config [3ms
]
-》加載擴展mbstring,iconv,hash,stardard
-》load 組件utf8,uri
-》load router [4ms
]
-》load output,input,lang[5ms
]
-》autoload package,cinfig,helper,language,driver,lib,model,db,cache
-》404 &empty$...handle [31ms
]
-》controller remap(測試性能寫了個remap)[35ms
]
-》controller 業務邏輯 [35ms
]
這個ci的加載過程以後,基本一幕瞭然,在autoload裏面耗時25ms。而後對autoload裏面8個組件一個一個分析。
分析完以後,處理特別簡單,下面這行代碼
$autoload['libraries'] = array('database');
ci 出於單例和複用角度考慮,選擇默認加載database
,也就是mysql在框架初始化的過程當中默認初始化了。
mysql連接在併發狀況下,init基本上要耗費10-30ms。直接幹掉。
幹掉以後,壓測基本上在10ms左右。
優化了配置等以後,ci在高併發下依然有10ms左右的加載時間,須要結合自身邏輯優化下,刪減掉部分不須要的功能和組件。
以前在追查問題的過程當中,粗讀了一遍代碼的流程。
而須要進一步優化,就須要細看每一個模塊函數的功能,幹掉不須要的,逐步優化。
-》index.php
做用:加載了部分全局變量,文件路徑等入口
優化:幹掉了整個web文件,調整了部分路徑
-》core/CodeIgniter.php
做用:ci的核心文件,基本上加載了整個模塊
優化:進入內部優化
-》加載common.php
做用:框架特別基本的一些函數log,show,error,is_xxx等,800行左右代碼
優化:暫時未處理
-》composer autoload func
-》加載benchmark
做用:benchmark性能追查工具,設置了全局的開始和結束時間
優化:直接幹掉
,全局處理。可是性能須要卡,就在index中初始化了一個入庫的timer
// 定義全局開始追查 list($msec, $sec) = explode(' ', microtime()); define('START_TIME', (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000)); // 定義全局uuid define('UUID', uniqid('xxx', true));
-》實例化hooks和預變量
做用:設計特別棒,對於一些hook或者針對不一樣模塊的預加載函數。
優化:直接幹掉
,7,8個hook後期用到再針對性添加
-》加載config
做用:對應的是ci的get_config等函數,加載了base_url,uri,cache path等 。
優化:直接幹掉
,全局變量佔用須要本身加就行,這種不可控的幹掉
-》加載擴展mbstring,iconv,hash,stardard
做用:一些額外的擴展。
優化:直接幹掉
,試了下幹掉對功能不影響,ci寫的太全面了,後期能夠經過加載本身的lib彌補。
-》load 組件utf8,uri
做用:uri路由方式處理,utf8的處理。
優化:直接幹掉
。
-》load router [4ms
]
做用:路由。
優化:幹不掉
。
額外:laravel 聽說是使用COC最好的框架,看了下ci的router也不錯,基本上都是遵循COC
-》load output,input
做用:output和瀏覽器交互輸出的處理組件,input包括獲取數據array_merge等等。
優化:幹掉
,須要本身寫
-》autoload package,cinfig,helper,language,driver,lib,model,db,cache
做用:各類各樣的組建了。
優化:全不
加載
-》404 &empty$...handle
做用:異常處理。
優化:加載
-》controller remap(測試性能寫了個remap)
做用:指向其餘controller。
優化:無
-》controller 業務邏輯
到此將整個框架過程優化完成,初始一下4-5ms感受還不錯。
2000qps+ ,均值約6ms
1500qps 10min,均值約6ms
問題:分析了部分數據的超時分佈,約千分之二超過30ms,以下圖【這塊須要以後優化】
nginx + php 均值:17ms
框架部分的均值:9ms 也基本上知足需求
ci 是一個比較優秀的輕量級MVC框架,能夠用來,業可否支撐1000-2000pqs的業務接口。
【轉載請註明:【CodeIgniter 性能優化 | 靠譜崔小拽 】