CodeIgniter 性能優化

背景:部署一套PHP微服務接口,須要兼顧性能,開發效率,擴展性。權衡後選擇了CodeIgniter;同時優化框架的默認啓動項,在qps1000+的壓力下整個啓動時間優化到5ms左右。php

1、選型

  • 背景:使用php做爲微服務的接口,具備必定的性能要求和併發要求。html

  • 方案:mysql

    • 1:選一個輕量的php框架。具備簡單高效的路由,模塊化便可。nginx

    • 2:在框架的基礎上,自定義的優化laravel

從如下幾個角度作了簡單的比較git

1.1 不一樣框架的性能

https://www.ruilog.com/blog/v...
ci performancegithub

列舉了不少數據,除了直接寫php以外,ci和lumen的併發和性能不錯,在考慮範圍內。web

1.2 從流行度上看。

github排名前四的是laravel,symfony,ci,yii2。最火的是laravel毋庸置疑。但前四均在考慮範圍內sql

ci github

1.3 從文檔來看。

laraval,ci,yii的中文社區都還不錯。數據庫

綜合考慮以後,在知足功能的狀況下,選擇性能最好,也易入手的codeIgniter做爲基礎框架。(整個包才2.5M,刪除了web文件夾後更小

2、30ms+到10ms[粗讀代碼]

框架的基本部署,直接參考官網:https://codeigniter.org.cn/

2.1 問題描述

配置了數據庫以後,添加了一個默認的controller,一個model,默認加載時間居然30ms+—_-。瞬間懵逼了,nginx+fpm也就1-2ms,框架居然30ms,確定那裏配置錯了,決定沿着路由追一下。

2.2 問題追查

沿着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個組件一個一個分析。

2.3 問題緣由

分析完以後,處理特別簡單,下面這行代碼

$autoload['libraries'] = array('database');

ci 出於單例和複用角度考慮,選擇默認加載database,也就是mysql在框架初始化的過程當中默認初始化了。
mysql連接在併發狀況下,init基本上要耗費10-30ms。直接幹掉。
幹掉以後,壓測基本上在10ms左右。

3、從10ms到5ms [細看代碼]

3.1 優化目標

優化了配置等以後,ci在高併發下依然有10ms左右的加載時間,須要結合自身邏輯優化下,刪減掉部分不須要的功能和組件。

3.2 代碼分析

以前在追查問題的過程當中,粗讀了一遍代碼的流程。
而須要進一步優化,就須要細看每一個模塊函數的功能,幹掉不須要的,逐步優化。

-》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感受還不錯。

4、壓測數據

4.1 高併發壓測

2000qps+ ,均值約6ms

4.2 長時間高負載壓測

1500qps 10min,均值約6ms

問題:分析了部分數據的超時分佈,約千分之二超過30ms,以下圖【這塊須要以後優化】
time_distribute

4.3 無限發壓

nginx + php 均值:17ms
框架部分的均值:9ms 也基本上知足需求
nginx_time

5、彙總

ci 是一個比較優秀的輕量級MVC框架,能夠用來,業可否支撐1000-2000pqs的業務接口。

最後來一張ci的路由圖
all

【轉載請註明:【CodeIgniter 性能優化 | 靠譜崔小拽

相關文章
相關標籤/搜索