目錄
1. 架構最佳化
2. 關閉調試模式
3. 使用單模組
4. 路由設計及最佳化
合理使用查詢快取
正确使用模型关联
大量数据处理优化
善用数据集方法避免多次查询
6.0 配置和公共文件缓存
7.0 生成类库映射
首頁 php框架 ThinkPHP 幫助你有效提升ThinkPHP的應用效能!

幫助你有效提升ThinkPHP的應用效能!

Dec 03, 2020 pm 02:41 PM
thinkphp

#下面由thinkphp框架教學欄位介紹如何有效提升ThinkPHP的應用效能,希望對需要的朋友有幫助!

幫助你有效提升ThinkPHP的應用效能!

說到應用程式效能,涉及到的方方面面實在是太多了,關於伺服器優化和前端優化的文章網上很多,所以就不再累述了。本文僅拋磚引玉淺述下ThinkPHP 5.1 應用開發中(尤其是部署環境)可能涉及的一些效能最佳化手段和注意事項。

推薦:《ThinkPHP 5.1全球首發影片教學

首先要強調一點:框架並不是應用效能的瓶頸,架構設計、資料庫和人才是。框架在設計之初,出於通用性考慮,不會特意針對某個應用做深入優化,但提供了一些可能的手段和配置參數讓你進行針對性的調優,下面就列舉一些可能的優化手段,在開發的時候可以視情況調整。

正確的效能最佳化步驟應該是:架構最佳化、資料庫最佳化、程式碼最佳化。

1. 架構最佳化

架構最佳化涉及技術、儲存、網路、服務的選用和架構,盡量使用成熟和現代的開發架構和設計模式。前後端完全分離設計,方便前後端的獨立優化,也更方便測試工作。

如果你的應用程式遇到了效能瓶頸,這個時候要考慮的就是最佳化架構而不是最佳化程式碼本身,因為架構層面的最佳化效果往往是最顯著的。

2. 關閉調試模式

部署環境千萬不要忘記關閉調試模式,這不僅僅是出於性能考慮,更多是基於安全因素。事實上,建議透過環境變數來配置關閉調試模式,這樣部署後就不需要更改任何設定檔。

因為偵錯模式影響日誌記錄資訊、額外的偵錯資訊和快取失效,關閉偵錯模式能夠帶來一定的效能提升。

3. 使用單模組

使用多模組功能會增加檔案的I/O 開銷和額外的設定及檢查,如非必要在規劃你的應用架構的時候盡量考慮使用單一模組,然後再使用控制器分級來解決控制器過多的問題。

使用單一模組的效能優勢,在部署到swoole 的時候可以得到更充分的體現,因為應用程式檔案一旦啟動服務,就會載入內存,而模組的相關文件則會每次請求重新載入。

4. 路由設計及最佳化

在定義路由規則的時候,不要使用陣列方式,盡量使用方法註冊路由,並且多使用路由分組(或資源路由)。分組路由可以減少路由的匹配次數,進而提昇路由效能。如果你有多個網域的不同路由,也要依網域規劃使用路由。

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

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

// 开启路由延迟解析
'url_lazy_route'    => true,
登入後複製

如果同一個分組下面有比較多的路由規則,建議合併路由規則。

// 合并分组路由规则
'route_rule_merge'       => true,
登入後複製

對於GET請求的路由,可以設定路由的請求快取。

// 定义GET请求路由规则 并设置3600秒的缓存
Route::get('new/:id','News/read')->cache(3600);
登入後複製

部署階段,可以開啟路由快取。

// 开启路由缓存(仅部署模式有效)
'route_check_cache'	=>	true,
登入後複製

5. 查詢最佳化

首先保持良好的開發習慣,了解Db類別和模型的正確使用姿勢,資料庫本身的效能最佳化可以參考MySQL效能最佳化的最佳21條經驗,以下主要是對框架中資料查詢相關的最佳化策略。

合理使用查詢快取

盡量減少每次要求的查詢次數,並對即時性要求不高的資料查詢合理規劃資料查詢快取(優先考慮使用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查询设计经过了较为合理的优化,正确使用模型一样可以有出色的性能,而且比Db查询要方便很多。

尤其是对于一些复杂的设计来说使用模型关联显得比直接用Db更加简单,例如使用关联预载入查询就可以避免N+1查询问题。

User::with(['profile','book'])->select();
登入後複製

如果用Db类自己实现的话,费时费力,性能还不一定优。

大量数据处理优化

对于大量数据的处理操作,使用chunk分批处理方法。

User::chunk(100, function($users) {
    foreach ($users as $user) {
        // 处理数据
    }});
登入後複製

对于内存开销比较大的应用,在做大量数据查询和处理的时候,使用cursor方法,可以利用PHP的生成器特性,减少内存占用。

$cursor = User::cursor();foreach($cursor as $user){
    // 处理数据
    }
登入後複製

你会发现用户数据不论是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
登入後複製

注意:一旦配置或者公共文件发生变化,必须重新生成。

7.0 生成类库映射

类库映射可以提升类库的自动加载性能,使用下面的指令可以生成系统类库和应用类库的类库映射(包括extend目录下的类库)。

php think optimize:autoload
登入後複製

vendor目录下的类库可以使用composer的dump-autoload指令优化加载性能。

composer dump-autoload -o
登入後複製

该命令把 PSR-0 和 PSR-4 转换为一个类映射表,来提高类的加载速度。

以上是幫助你有效提升ThinkPHP的應用效能!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1272
29
C# 教程
1252
24
thinkphp專案怎麼運行 thinkphp專案怎麼運行 Apr 09, 2024 pm 05:33 PM

執行 ThinkPHP 專案需要:安裝 Composer;使用 Composer 建立專案;進入專案目錄,執行 php bin/console serve;造訪 http://localhost:8000 查看歡迎頁面。

thinkphp有幾個版本 thinkphp有幾個版本 Apr 09, 2024 pm 06:09 PM

ThinkPHP 擁有多個版本,針對不同 PHP 版本而設計。主要版本包括 3.2、5.0、5.1 和 6.0,而次要版本用於修復 bug 和提供新功能。目前最新穩定版本為 ThinkPHP 6.0.16。在選擇版本時,需考慮 PHP 版本、功能需求和社群支援。建議使用最新穩定版本以獲得最佳性能和支援。

thinkphp怎麼運行 thinkphp怎麼運行 Apr 09, 2024 pm 05:39 PM

ThinkPHP Framework 的本機運作步驟:下載並解壓縮 ThinkPHP Framework 到本機目錄。建立虛擬主機(可選),指向 ThinkPHP 根目錄。配置資料庫連線參數。啟動 Web 伺服器。初始化 ThinkPHP 應用程式。存取 ThinkPHP 應用程式 URL 運行。

laravel和thinkphp哪個好 laravel和thinkphp哪個好 Apr 09, 2024 pm 03:18 PM

Laravel 和 ThinkPHP 框架的效能比較:ThinkPHP 效能通常優於 Laravel,專注於最佳化和快取。 Laravel 性能良好,但對於複雜應用程序,ThinkPHP 可能更適合。

開發建議:如何利用ThinkPHP框架實現非同步任務 開發建議:如何利用ThinkPHP框架實現非同步任務 Nov 22, 2023 pm 12:01 PM

《開發建議:如何利用ThinkPHP框架實現非同步任務》隨著網路技術的快速發展,Web應用程式對於處理大量並發請求和複雜業務邏輯的需求也越來越高。為了提高系統的效能和使用者體驗,開發人員常常會考慮利用非同步任務來執行一些耗時操作,例如發送郵件、處理文件上傳、產生報表等。在PHP領域,ThinkPHP框架作為一個流行的開發框架,提供了一些便捷的方式來實現非同步任務。

thinkphp怎麼安裝 thinkphp怎麼安裝 Apr 09, 2024 pm 05:42 PM

ThinkPHP 安裝步驟:準備 PHP、Composer、MySQL 環境。使用 Composer 建立專案。安裝 ThinkPHP 框架及相依性。配置資料庫連線。產生應用程式碼。啟動應用程式並造訪 http://localhost:8000。

thinkphp效能怎麼樣 thinkphp效能怎麼樣 Apr 09, 2024 pm 05:24 PM

ThinkPHP 是一款高效能的 PHP 框架,具備快取機制、程式碼最佳化、平行處理和資料庫最佳化等優勢。官方性能測試顯示,它每秒可處理超過 10,000 個請求,實際應用中被廣泛用於京東商城、攜程網等大型網站和企業系統。

開發建議:如何利用ThinkPHP框架進行API開發 開發建議:如何利用ThinkPHP框架進行API開發 Nov 22, 2023 pm 05:18 PM

開發建議:如何利用ThinkPHP框架進行API開發隨著網際網路的不斷發展,API(ApplicationProgrammingInterface)的重要性也日益凸顯。 API是不同應用程式之間進行通訊的橋樑,它可以實現資料共享、功能呼叫等操作,為開發者提供了相對簡單且快速的開發方式。而ThinkPHP框架作為一款優秀的PHP開發框架,具有高效能、可擴展且易用

See all articles