中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

如何提高ThinkPHP的應用性能-創(chuàng)新互聯

小編給大家分享一下如何提高ThinkPHP的應用性能,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

創(chuàng)新互聯建站服務項目包括開封網站建設、開封網站制作、開封網頁制作以及開封網絡營銷策劃等。多年來,我們專注于互聯網行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯網行業(yè)的解決方案,開封網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到開封省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!

說到應用性能,涉及到的方方面面實在是太多了,關于服務器優(yōu)化和前端優(yōu)化的文章網上很多,所以就不再累述了。本文僅拋磚引玉淺述下ThinkPHP5.1 應用開發(fā)中(尤其是部署環(huán)境)可能涉及的一些性能優(yōu)化手段和注意事項。


首先要強調一點:框架并不是應用性能的瓶頸,架構設計、數據庫和人才是??蚣茉谠O計之初,出于通用性考慮,不會特意針對某個應用做深入優(yōu)化,但提供了一些可能的手段和配置參數讓你進行針對性的調優(yōu),下面就列舉一些可能的優(yōu)化手段,在開發(fā)的時候可以根據情況調整。

正確的性能優(yōu)化步驟應該是:架構優(yōu)化、數據庫優(yōu)化、代碼優(yōu)化。

1. 架構優(yōu)化

架構優(yōu)化涉及到技術、存儲、網絡、服務的選型和構架,盡量使用成熟和現代的開發(fā)架構和設計模式。前后端完全分離設計,便于前后端的獨立優(yōu)化,也更加便于測試工作。

如果你的應用遇到了性能瓶頸,這個時候要考慮的就是優(yōu)化架構而不是優(yōu)化代碼本身,因為架構層面的優(yōu)化效果往往是最顯著的。

2. 關閉調試模式

部署環(huán)境千萬不要忘記關閉調試模式,這不僅僅是出于性能考慮,更多是基于安全因素。事實上,建議通過環(huán)境變量來配置關閉調試模式,這樣部署后不需要更改任何配置文件。

因為調試模式影響日志記錄信息、額外的調試信息和緩存失效,關閉調試模式能夠帶來一定的性能提升。

3. 使用單模塊

使用多模塊功能會增加文件的I/O 開銷和額外的配置及檢查,如非必要在規(guī)劃你的應用架構的時候盡量考慮使用單一模塊,然后使用控制器分級來解決控制器過多的問題。

使用單一模塊的性能優(yōu)勢,在部署到swoole 的時候可以得到更加充分的體現,因為應用文件一旦啟動服務,就會載入內存,而模塊的相關文件則會每次請求重新加載。

4. 路由設計及優(yōu)化

在定義路由規(guī)則的時候,不要使用數組方式,盡量使用方法注冊路由,并且多使用路由分組(或者資源路由)。分組路由可以減少路由的匹配次數,從而提升路由性能。如果你有多個域名的不同路由,也要按域名規(guī)劃使用路由。

盡可能設計在路由中進行當前路由的數據驗證和權限檢查等操作,一方面比較清晰,另外一方面可以盡量把驗證操作提前,而不必等到控制器執(zhí)行。

在分組比較多的情況下,開啟路由的延遲解析。

// 開啟路由延遲解析
'url_lazy_route'    => true,

如果同一個分組下面有比較多的路由規(guī)則,建議合并路由規(guī)則。


// 合并分組路由規(guī)則
'route_rule_merge'       => true,

對于GET請求的路由,可以設置路由的請求緩存。


// 定義GET請求路由規(guī)則 并設置3600秒的緩存
Route::get('new/:id','News/read')->cache(3600);

部署階段,可以開啟路由緩存。


// 開啟路由緩存(僅部署模式有效)
'route_check_cache'	=>	true,

5. 查詢優(yōu)化


首先保持良好的開發(fā)習慣,了解 Db類和模型的正確使用姿勢,數據庫本身的性能優(yōu)化可以參考 MySQL性能優(yōu)化的很好21條經驗,下面主要是對框架中數據查詢相關的優(yōu)化策略。

盡量減少每次請求的查詢次數,并對實時性要求不高的數據查詢合理規(guī)劃數據查詢緩存(優(yōu)先考慮使用Redis緩存)。

Blog::where('id', 10)
    ->cache(30)
    ->find();

如果使用了關聯查詢,cache方法只能用于主模型的數據緩存,但你可以使用Cache類的remember方法進行方便的數據緩存。


$users = Cache::remember('users', function(){
    return User::with('profile')
        ->where('status', 1)
        ->select();},30);

不要過于糾結查詢次數


盡量減少查詢次數是出于性能考慮,但不是必須,使用最少的查詢不代表性能就一定是高。一個復雜的JOIN查詢性能不見得有兩次簡單的查詢高,而使用簡單的查詢反而更清晰易懂,并且更方便進行數據查詢緩存。

不要總是以為模型的性能一定比Db類低,框架的ORM查詢設計經過了較為合理的優(yōu)化,正確使用模型一樣可以有出色的性能,而且比Db查詢要方便很多。

尤其是對于一些復雜的設計來說使用模型關聯顯得比直接用Db更加簡單,例如使用關聯預載入查詢就可以避免N+1查詢問題。

User::with(['profile','book'])->select();

如果用Db類自己實現的話,費時費力,性能還不一定優(yōu)。


對于大量數據的處理操作,使用chunk分批處理方法。

User::chunk(100, function($users) {
    foreach ($users as $user) {
        // 處理數據
    }});

對于內存開銷比較大的應用,在做大量數據查詢和處理的時候,使用cursor方法,可以利用PHP的生成器特性,減少內存占用。


$cursor = User::cursor();foreach($cursor as $user){
    // 處理數據
    }

你會發(fā)現用戶數據不論是1萬還是10萬級別,內存開銷并沒有大的變化。


涉及到對大量數據的處理,包括數據遷移、批量更新,盡量使用命令行指令運行,否則會因為超時而中斷。

可以通過數據集的方法完成的子集或者排序操作不要再次查詢,例如:

// 模型查詢返回數據集對象
$users = User::select();
// 按照用戶的成績由高到低排序
$list1 = $users->order('score', 'desc');
// 篩選成績在90分以上的用戶
$list2 = $users->where('score', '>=', 90);

字段緩存


利用下面指令在部署后生成字段緩存,可以減少每次數據表的字段查詢開銷。

php think optimize:schema

更多用法可以參考官方手冊的數據字段緩存。


6.0 配置和公共文件緩存

每次在應用初始化或者模塊初始化的時候會有一定的I/O開銷,如果已經開啟OpCache的話對性能影響甚微,如果比較在意的也可以通過命令行指令生成配置緩存(包括相關的公共文件和各種定義文件)。

生成應用配置緩存:

php think optimize:config

生成模塊配置緩存:


php think optimize:config index

注意:一旦配置或者公共文件發(fā)生變化,必須重新生成。

7.0 生成類庫映射

類庫映射可以提升類庫的自動加載性能,使用下面的指令可以生成系統(tǒng)類庫和應用類庫的類庫映射(包括extend目錄下的類庫)。

php think optimize:autoload

vendor目錄下的類庫可以使用composer的dump-autoload指令優(yōu)化加載性能。

composer dump-autoload -o

該命令把 PSR-0 和 PSR-4 轉換為一個類映射表,來提高類的加載速度。

看完了這篇文章,相信你對如何提高ThinkPHP的應用性能有了一定的了解,想了解更多相關知識,歡迎關注創(chuàng)新互聯行業(yè)資訊頻道,感謝各位的閱讀!

網頁題目:如何提高ThinkPHP的應用性能-創(chuàng)新互聯
網頁URL:http://www.rwnh.cn/article38/ceihsp.html

成都網站建設公司_創(chuàng)新互聯,為您提供關鍵詞優(yōu)化、外貿網站建設云服務器、網站排名品牌網站制作、網站改版

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

手機網站建設
乌兰浩特市| 肇庆市| 台中县| 吉安县| 新乡县| 元谋县| 新乡县| 开阳县| 航空| 平阴县| 调兵山市| 海城市| 古浪县| 巩义市| 乌拉特后旗| 丹棱县| 西昌市| 宣城市| 积石山| 台东市| 甘孜县| 齐河县| 昔阳县| 达拉特旗| 阳江市| 上蔡县| 沈丘县| 洛宁县| 克拉玛依市| 潜山县| 凉山| 信阳市| 蒙阴县| 花莲市| 陕西省| 黑河市| 广水市| 金塔县| 武功县| 元阳县| 铁力市|