成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

記一次 Laravel 應(yīng)用性能調(diào)優(yōu)經(jīng)歷

warkiz / 2844人閱讀

摘要:為了一探究竟,于是開啟了這次應(yīng)用性能調(diào)優(yōu)之旅。使用即時編譯器和都能輕輕松松的讓你的應(yīng)用程序在不用做任何修改的情況下,直接提高或者更高的性能。

這是一份事后的總結(jié)。在經(jīng)歷了調(diào)優(yōu)過程踩的很多坑之后,我們最終完善并實施了初步的性能測試方案,通過真實的測試數(shù)據(jù)歸納出了 Laravel 開發(fā)過程中的一些實踐技巧。

0x00 源起

最近有同事反饋 Laravel 寫的應(yīng)用程序響應(yīng)有點慢、20幾個并發(fā)把 CPU 跑滿... 為了解決慢的問題,甚至一部分接口用 nodejs 來寫。

而我的第一反應(yīng)是一個流行的框架怎么可能會有這么不堪?一定是使用上哪里出現(xiàn)了問題。為了一探究竟,于是開啟了這次 Laravel 應(yīng)用性能調(diào)優(yōu)之旅。

0x01 調(diào)優(yōu)技巧

這次性能測試方案中用到的優(yōu)化技巧主要基于 Laravel 框架本身及其提供的工具。

關(guān)閉應(yīng)用debug app.debug=false

緩存配置信息 php artisan config:cache

緩存路由信息 php artisan router:cache

類映射加載優(yōu)化 php artisan optimize

自動加載優(yōu)化 composer dumpautoload

根據(jù)需要只加載必要的中間件

使用即時編譯器(JIT),如:HHVM、OPcache

使用 PHP 7.x

除了以上優(yōu)化技巧之外,還有很多編碼上的實踐可以提升 Laravel 應(yīng)用性能,在本文中暫時不會做說明。(也可以關(guān)注我的后續(xù)文章)

1. 關(guān)閉應(yīng)用 debug

打開應(yīng)用根目錄下的 .env 文件,把 debug 設(shè)置為 false。

APP_DEBUG=false
2. 緩存配置信息
php artisan config:cache

運(yùn)行以上命令可以把 config 文件夾里所有配置信息合并到一個 bootstrap/cache/config.php 文件中,減少運(yùn)行時載入文件的數(shù)量。

php artisan config:clear

運(yùn)行以上命令可以清除配置信息的緩存,也就是刪除 bootstrap/cache/config.php 文件

3. 緩存路由信息
php artisan route:cache

運(yùn)行以上命令會生成文件 bootstrap/cache/routes.php。路由緩存可以有效的提高路由器的注冊效率,在大型應(yīng)用程序中效果越加明顯。

php artisan route:clear

運(yùn)行以上命令會清除路由緩存,也就是刪除 bootstrap/cache/routes.php 文件。

4. 類映射加載優(yōu)化
php artisan optimize --force

運(yùn)行以上命令能夠把常用加載的類合并到一個文件中,通過減少文件的加載來提高運(yùn)行效率。這個命令會生成 bootstrap/cache/compiled.phpbootstrap/cache/services.json 兩個文件。

通過修改 config/compile.php 文件可以添加要合并的類。

在生產(chǎn)環(huán)境中不需要指定 --force 參數(shù)文件也可以自動生成。

php artisan clear-compiled

運(yùn)行以上命令會清除類映射加載優(yōu)化,也就是刪除 bootstrap/cache/compiled.phpbootstrap/cache/services.json 兩個文件。

5. 自動加載優(yōu)化
composer dumpautoload -o

Laravel 應(yīng)用程序是使用 composer 來構(gòu)建的。這個命令會把 PSR-0 和 PSR-4 轉(zhuǎn)換為一個類映射表來提高類的加載速度。

注意:php artisan optimize --force 命令里已經(jīng)做了這個操作。

6. 根據(jù)需要只加載必要的中間件

Laravel 應(yīng)用程序內(nèi)置了并開啟了很多的中間件。每一個 Laravel 的請求都會加載相關(guān)的中間件、產(chǎn)生各種數(shù)據(jù)。在 app/Http/Kernel.php 中注釋掉不需要的中間件(如 session 支持)可以極大的提升性能。

7. 使用即時編譯器

HHVM 和 OPcache 都能輕輕松松的讓你的應(yīng)用程序在不用做任何修改的情況下,直接提高 50% 或者更高的性能。

8. 使用 PHP 7.x

只能說 PHP 7.x 比起之前的版本在性能上有了極大的提升。

嗯,限于你的真實企業(yè)環(huán)境,這個也許很長時間內(nèi)改變不了,算我沒說。

0x02 測試方案

我們使用簡單的 Apache ab 命令僅對應(yīng)用入口文件進(jìn)行測試,并記錄和分析數(shù)據(jù)。

僅對應(yīng)用的入口文件 index.php 進(jìn)行測試,訪問 “/” 或者 “/index.php” 返回框架的歡迎頁面。更全面的性能測試需要針對應(yīng)用的更多接口進(jìn)行測試。

使用 Apache ab 命令。ab -t 10 -c 10 {url}。該命令表示對 url 同時發(fā)起 10 個請求,并持續(xù) 10 秒鐘。命令中具體的參數(shù)設(shè)置需要根據(jù)要測試的服務(wù)器性能進(jìn)行選擇。

為了避免機(jī)器波動導(dǎo)致的數(shù)據(jù)錯誤,每種測試條件會執(zhí)行多次 ab 命令,并記錄命令執(zhí)行結(jié)果,重點關(guān)注每秒處理的請求數(shù)及請求響應(yīng)時間,分析并剔除異常值。

每次對測試條件進(jìn)行了調(diào)整,需要在瀏覽器上對歡迎頁進(jìn)行訪問,確保沒有因為測試條件修改而訪問出錯。如果頁面訪問出錯會導(dǎo)致測試結(jié)果錯誤。

服務(wù)器環(huán)境說明

所有脫離具體環(huán)境的測試數(shù)據(jù)都沒有意義,并且只有在相近的條件下才可以進(jìn)行比較。

這套環(huán)境運(yùn)行在 Mac 上,內(nèi)存 8G,處理器 2.8GHz,SSD 硬盤。

測試服務(wù)器是使用 Homestead 搭建的。虛擬機(jī)配置為單核 CPU、2G 內(nèi)存。

服務(wù)器 PHP 版本為 7.1,未特殊說明,則標(biāo)識開啟了 OPcache。

測試的 Laravel 應(yīng)用程序采用 5.2 版本編寫。appHttp outes.php 中定義了 85 個路由。

測試過程中除了虛擬機(jī)、終端及固定的瀏覽器窗口外,沒有會影響機(jī)器的程序運(yùn)行。

以上的數(shù)據(jù),大家在自己進(jìn)行測試時可以參考。

0x03 測試過程及數(shù)據(jù) 1. 未做任何優(yōu)化 1.1 操作

按照以下檢查項執(zhí)行相應(yīng)的操作。

運(yùn)行 ab -t 10 -c 10 http://myurl.com/index.php

基礎(chǔ)檢查項

.env 文件中 APP_DEBUG=true

不存在 bootstrap/cache/config.php

不存在 bootstrap/cache/routes.php

不存在 bootstrap/cache/compiled.phpbootstrap/cache/services.json

app/Http/Kernel.php 中開啟了大部分的中間件

瀏覽器訪問 Laravel 應(yīng)用程序歡迎頁確保正常訪問

1.2 數(shù)據(jù)記錄

2. 關(guān)閉應(yīng)用debug 2.1 操作

在步驟 1 基礎(chǔ)上修改 .env 文件中 APP_DEBUG=false。

瀏覽器訪問 Laravel 應(yīng)用程序歡迎頁確保正常訪問。

運(yùn)行 ab -t 10 -c 10 http://myurl.com/index.php

2.2 數(shù)據(jù)記錄

2.3 對比結(jié)果

與步驟 1 結(jié)果比較發(fā)現(xiàn):關(guān)閉應(yīng)用 debug 之后,每秒處理請求數(shù)從 26-34 上升到 33-35,請求響應(yīng)時間從 大部分 300ms 以上下降到 290ms 左右,效果不太明顯,但確實有一定的提升。

注意:這部分與應(yīng)用中的日志等使用情況有比較大的關(guān)聯(lián)。

3. 開啟緩存配置信息 3.1 操作

在步驟 2 基礎(chǔ)上,運(yùn)行 php artisan config:cache,確認(rèn)生成 bootstrap/cache/config.php

瀏覽器訪問 Laravel 應(yīng)用程序歡迎頁確保正常訪問。

運(yùn)行 ab -t 10 -c 10 http://myurl.com/index.php

3.2 數(shù)據(jù)記錄

3.3 對比結(jié)果

與步驟 2 結(jié)果比較發(fā)現(xiàn):開啟配置信息緩存之后,每秒處理請求數(shù)從 33-35 上升到 36-38,請求響應(yīng)時間從 290ms 左右下降到 260ms 左右,效果不太明顯,但確實有一定的提升。

4. 開啟緩存路由信息 4.1 操作

在步驟 3 基礎(chǔ)上,運(yùn)行 php artisan route:cache,確認(rèn)生成 bootstrap/cache/routes.php。

瀏覽器訪問 Laravel 應(yīng)用程序歡迎頁確保正常訪問。

運(yùn)行 ab -t 10 -c 10 http://myurl.com/index.php。

4.2 數(shù)據(jù)記錄

4.3 對比結(jié)果

與步驟 3 結(jié)果比較發(fā)現(xiàn):開啟路由信息緩存之后,每秒處理請求數(shù)從 36-38 上升到 60 左右,請求響應(yīng)時間從 260ms 下降到 160ms 左右,效果顯著,從 TPS 看,提升了 70%。

5. 刪除不必要的中間件 5.1 操作

在步驟 4 基礎(chǔ)上,注釋掉不必要的中間件代碼。

瀏覽器訪問 Laravel 應(yīng)用程序歡迎頁確保正常訪問。

運(yùn)行 ab -t 10 -c 10 http://myurl.com/index.php。

注意:這次測試中我注釋掉了所有的中間件。實際情況中應(yīng)該盡量只留下必要的中間件。

5.2 數(shù)據(jù)記錄

5.3 對比結(jié)果

與步驟 4 結(jié)果比較發(fā)現(xiàn):刪除了不必要的中間件之后,每秒處理請求數(shù)從 60 左右上升到 90 左右,請求響應(yīng)時間從 160ms 下降到 110ms 左右,效果非常明顯,從 TPS 看,提升了 50%。

6. 開啟類映射加載優(yōu)化 6.1 操作

在步驟 5 基礎(chǔ)上,運(yùn)行 php artisan optimize --force,確認(rèn)生成 bootstrap/cache/compiled.phpbootstrap/cache/services.json

瀏覽器訪問 Laravel 應(yīng)用程序歡迎頁確保正常訪問。

運(yùn)行 ab -t 10 -c 10 http://myurl.com/index.php

6.2 數(shù)據(jù)記錄

6.3 對比結(jié)果

與步驟 5 結(jié)果比較發(fā)現(xiàn):做了類映射加載優(yōu)化之后,每秒處理請求數(shù)從 90 上升到 110,請求響應(yīng)時間從 110ms 下降到 100ms 以下,效果還是比較明顯的。

7. 關(guān)閉 OPcache 7.1 操作

在步驟 6 基礎(chǔ)上,關(guān)閉 PHP 的 OPcache,并重啟服務(wù)器。通過 phpinfo() 的 Zend OPcache 確認(rèn) OPcache 已經(jīng)關(guān)閉。

瀏覽器訪問 Laravel 應(yīng)用程序歡迎頁確保正常訪問。

運(yùn)行 ab -t 10 -c 10 http://myurl.com/index.php。

7.2 數(shù)據(jù)記錄

7.3 對比結(jié)果

與步驟 6 結(jié)果比較發(fā)現(xiàn):關(guān)閉 OPcache 之后,每秒處理請求數(shù)從 110 下降到 15,請求響應(yīng)時間從 100ms 以下上升到 650ms 以上。開啟與關(guān)閉 OPcache,數(shù)據(jù)上竟有幾倍的差別。

此后,我重新開啟了 PHP 的 OPcache,數(shù)據(jù)恢復(fù)到步驟 6 水平。

0x04 踩過的坑 1. [LogicException] Unable to prepare route [/] for serialization. Uses Closure.

在運(yùn)行 php artisan route:cache 命令時報這個錯誤。

原因:路由文件中處理“/”時使用了閉包的方式。要運(yùn)行該命令,路由的具體實現(xiàn)不能使用閉包方式。

修改方案:將路由的具體實現(xiàn)放到控制器中來實現(xiàn)。

2. [Exception] Serialization of "Closure" is not allowed.

在運(yùn)行 php artisan route:cache 命令時報這個錯誤。

原因:路由文件中定義了重復(fù)的路由。

修改方案:排查路由文件中的重復(fù)路由并修改。尤其要注意 resource 方法很可能導(dǎo)致與其方法重復(fù)。

3. [RuntimeException] Invalid filename provided.

在運(yùn)行 php artisan optimize --force 命名時報這個錯誤。

原因:在加載需要編譯的類時沒有找到相應(yīng)的文件。5.2 版本的 vendor/laravel/framework/src/Illuminate/Foundation/Console/Optimize/config.php 中定義了要編譯的文件路徑,但不知道為什么 /vendor/laravel/framework/src/Illuminate/Database/Eloquent/ActiveRecords.php 沒有找到,所以報了這個錯誤。

修改方案:暫時注釋掉了以上 config.php 中的 ../ActiveRecords.php 一行。

4. InvalidArgumentException in FileViewFinder.php line 137: View [welcome] not found.

在運(yùn)行 php artisan config:cache 之后,瀏覽器上訪問 Laravel 應(yīng)用程序歡迎頁報這個錯誤。

原因:Laravel 應(yīng)用程序服務(wù)器是通過 Homestead 在虛擬機(jī)上搭建的。而這個命令我是在虛擬機(jī)之外運(yùn)行的,導(dǎo)致生成的 config.php 中的路徑是本機(jī)路徑,而不是虛擬機(jī)上的路徑。所以無法找到視圖文件。

修改方案:ssh 到虛擬機(jī)內(nèi)部運(yùn)行該命令。

0x05 實踐技巧

坑也踩了,測試也做過了。這里針對這次經(jīng)歷做個實踐技巧的簡單總結(jié)。

1. 有效的 Laravel 應(yīng)用程序優(yōu)化技巧

關(guān)閉應(yīng)用debug app.debug=false

緩存配置信息 php artisan config:cache

緩存路由信息 php artisan router:cache

類映射加載優(yōu)化 php artisan optimize(包含自動加載優(yōu)化 composer dumpautoload

根據(jù)需要只加載必要的中間件

使用即時編譯器(JIT),如:HHVM、OPcache

2. 編寫代碼時注意事項

路由的具體實現(xiàn)放到控制器中。

不定義重復(fù)的路由,尤其注意 resouce 方法。

弄清各中間件的作用,刪除不必要的中間件引用。

0x06 下一步

以上的調(diào)優(yōu)技巧及編碼注意事項主要針對框架本身,在真正的業(yè)務(wù)邏輯編碼中有很多具體的優(yōu)化技巧,在此沒有討論。

后續(xù)的優(yōu)化重點將會放在具體編碼實踐上:

使用 Memcached 來存儲會話 config/session.php

使用專業(yè)的緩存驅(qū)動器

數(shù)據(jù)庫請求優(yōu)化

為數(shù)據(jù)集書寫緩存邏輯

前端資源合并 Elixir

0x07 寫在最后

網(wǎng)上看到很多框架性能對比的文章與爭論,也看到很多簡單貼出了數(shù)據(jù)。這些都不足以窺探真實的情況,所以有了我們這次的實踐,并在過程中做了詳實的記錄。在各位讀者實踐過程中提供參考、比較、反思之用。對于這次實踐有疑問的讀者,也歡迎提出問題和意見。

不多說了,要學(xué)習(xí)更多技術(shù)干貨,請關(guān)注微信公眾號:up2048。

- EOF -

推薦閱讀

Laravel思維導(dǎo)圖之Laravel HTTP請求、響應(yīng)、表單驗證

Laravel思維導(dǎo)圖之Laravel HTTP路由、中間件、控制器

Laravel思維導(dǎo)圖之Laravel核心概念

Laravel思維導(dǎo)圖之Laravel入門指南

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/30644.html

相關(guān)文章

  • 一次PHP并發(fā)性能調(diào)優(yōu)實戰(zhàn) -- 性能提升104%

    摘要:這是多處理器系統(tǒng)中,調(diào)度器用來分散任務(wù)到不同的機(jī)制,通常也被稱為處理器間中斷,。文章編寫計劃 待完成: 詳細(xì)介紹用到的各個工具 作者: 萬千鈞(祝星) 適合閱讀人群 文中的調(diào)優(yōu)思路無論是php, java, 還是其他任何語言都是用. 如果你有php使用經(jīng)驗, 那肯定就更好了 業(yè)務(wù)背景 框架及相應(yīng)環(huán)境 laravel5.7, mysql5.7, redis5, nginx1.15 cento...

    番茄西紅柿 評論0 收藏0
  • 一次PHP并發(fā)性能調(diào)優(yōu)實戰(zhàn) -- 性能提升104%

    摘要:這是多處理器系統(tǒng)中,調(diào)度器用來分散任務(wù)到不同的機(jī)制,通常也被稱為處理器間中斷,。文章編寫計劃 待完成: 詳細(xì)介紹用到的各個工具 作者: 萬千鈞(祝星) 適合閱讀人群 文中的調(diào)優(yōu)思路無論是php, java, 還是其他任何語言都是用. 如果你有php使用經(jīng)驗, 那肯定就更好了 業(yè)務(wù)背景 框架及相應(yīng)環(huán)境 laravel5.7, mysql5.7, redis5, nginx1.15 cento...

    xeblog 評論0 收藏0
  • Laravel思維導(dǎo)圖之HTTP請求、響應(yīng)、表單驗證

    摘要:今天我來分享中層關(guān)于請求響應(yīng)與表單驗證的知識。手動創(chuàng)建驗證請求之前的內(nèi)容是直接使用的方法來實現(xiàn)表單驗證。下一步到這篇為止,我完成了入門指南核心概念層的路由中間件控制器請求響應(yīng)表單驗證的學(xué)習(xí)和整理。 showImg(https://segmentfault.com/img/remote/1460000010882838); 今天我來分享 Laravel 中 HTTP 層關(guān)于請求、響應(yīng)與表...

    lewif 評論0 收藏0
  • 一次Laravel-permission 項目的性能優(yōu)化

    摘要:我最近研究分析了在上面創(chuàng)建的項目的性能。經(jīng)過查閱更多資料和研究,發(fā)現(xiàn)一個可能明顯改善的性能問題。在這個檢查的過程中任何的遲鈍都會成為整個項目的性能瓶頸。過濾集合類過濾權(quán)限集合的方法被認(rèn)為是造成低性能的原因。使用代替可以提高的性能。 showImg(https://segmentfault.com/img/remote/1460000015273870); 我最近研究分析了在?SWIS上...

    Nino 評論0 收藏0
  • 2017年3月份前端資源分享

    平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個網(wǎng)址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進(jìn)擊的 Promise Effective JavaScript leeheys blog -...

    ermaoL 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<