首頁 > php框架 > Laravel > 主體

提高Laravel應用效能

步履不停
發布: 2019-06-23 13:53:37
原創
3600 人瀏覽過

提高Laravel應用效能

使用Laravel做開發是高效率且愉悅的體驗。
通常,當你準備部署應用程式的時候,你可能會意識到應用程式也許會在真實環境下表現不佳。

要明白的是,沒有銀彈。透過努力去對應用程式的每個細節完成所有的優化,速度可能會變慢,但使用下面這些技巧會讓你感到恰到好處。

快取設定檔

laravel 的設定項分佈在數十個設定檔中,在每次的請求中都將每個檔案including 進來很消耗效能。為了將所有的設定檔合併為一個,可以使用:

php artisan config:cache
登入後複製

記住修改了設定檔後不會影響現有的設定檔快取。為了刷新緩存,可以再次上述的命令。如果你想完全清除緩存,執行:

php artisan config:clear
登入後複製

路由緩存

在laravel中,路由也需要昂貴的開銷。用以下命令快取 routes.php 檔案:

php artisan route:cache
登入後複製

請注意,它不適用於閉包。如果你正在使用閉包,這是一個很好的機會將它們移動到控制器中,因為 artisan 命令在嘗試編譯綁定到閉包的路徑而不是正確的控制器方法時會拋出異常。
與配置快取相同,對 routes.php 的任何變更都不會有任何影響。若要刷新快取,請在每次更改路徑檔案時執行上面的命令。要完全清理乾淨路由緩存,請執行以下命令:

php artisan route:clear
登入後複製

類別映射載入最佳化

#在一個中型專案中,存在數百個PHP 來源檔案是很正常的事情,由於良好的程式設計習慣,我們會把程式碼做一些分離,每個php 檔案都有自己的責任。當然,這並非沒有缺點,Laravel 必須為每一次請求都載入這數百個文件,這是一件很消耗效能的事情。

因此,一個比較好的方法是聲明哪些檔案是使用者每個要求(如:服務提供者,中間件等)都需要載入的,然後將這些需要每次載入的檔案寫入在同一個檔案中,減少include 檔案的數量。

這類似於 javascript 將檔案合併為一個沒有差異 (webpack, gulp),會減少遊覽器會伺服器的請求。

如果需要新增其他的來源文件,可以在 config / compile.php 的files key中宣告。

當你把需要為每個請求都加載的檔案設定好之後,它們就會寫入同一個檔案中,減少載入檔案的效能消耗

php artisan optimize --force
登入後複製

優化composer 的自動載入

這不僅適用於laravel,也適用於任何使用composer 的應用程式。

我將首先解釋 PSR-4 自動載入器的工作原理,然後向您展示應該執行什麼命令來最佳化它。如果您對了解 composer 如何運作不感興趣,我建議您直接跳到關於控制台命令的段落處。

當您向 compsoser 要求 App\Controllers\AuthController 類別時,它會先在類別映射中搜尋直接關聯。 classmap 是一個由類別和檔案組成的 1 到 1 關聯的陣列。當然,由於您沒有手動將 Login 類別及其相關檔案新增至類別對應中,因此composer 將繼續在命名空間中搜尋。

因為App 是一個PSR-4 命名空間,預設是與Laravel 一起提供的,並且與app/ 資料夾相關聯,所以composer 將嘗試使用基本的字串操作過程將PSR-4 類別名轉換為檔案名稱。最後,它猜測App\Controllers\AuthController 必須位於AuthController.php 檔案中,它位於Controllers/ 資料夾中,剛好的是,該資料夾正好位於名稱空間資料夾中,即app/

所有這些艱苦的工作只是為了得到 App\Controllers\AuthController 類別存在於 app/Controllers/AuthController.php 檔案中。為了讓composer 掃描整個應用程式並建立類別和檔案的直接1 對1 關聯,請執行以下命令:

composer dumpautoload -o
登入後複製

請記住,如果您已經執行了php artisan optimize --force,那麼您就不必再執行這個函數了。因為優化命令已經告訴 composer 創建一個優化的自動載入器。

JIT 編譯器(即時編譯器)

PHP 並不是天然就被電腦理解的。你不能把它編譯為字節碼然後讓電腦運作。 PHP 必須要經過一個中介,像是 Zend 引擎,它會解釋 PHP 檔案並執行對應的 C 例程。如你所想,它的速度很慢。每次你的伺服器執行一個 PHP 文件,都必須把它轉換成 tokens —— 這個過程由 AST 解析器完成並解釋。不幸的是,解析器必須每次都編譯 PHP 文件,即使它每次都得到相同的結果。

為了讓你的應用程式速度更快,你需要一個 編譯一次,終生執行 的方法,而這就是一個 JIT 編譯器所做的事情。

对于 Laravel 所推荐使用的 JIT 编译器是 HHVM,由 Facebook 创立并广泛使用。Wikipedia、Etsy 和其他上千项目也在使用它。

使用更快的缓存和会话驱动

将 session 保存在文件中是种足够快速而又优雅的方法,自 PHP 开始的时代就在这样做了。但是如果你追求性能,那么文件系统就是你需要注意的一件事,因为它很慢。一种更好的做法是将 cache 和 session 存储在内存中,因为它提供了一种高效读写数据的方式。幸运的是,laravel 支持一些基于内存的 cache 和 session 驱动。

我的建议是使用 memcached 作为 cache 和 session 的驱动,但你可以选择任何你喜欢的,只要它是基于内存工作的。

要更改 session 驱动,需要检查以下文件中「driver」项:

app/config/session.php
登入後複製

要更改 cache 驱动,需要检查以下文件中「driver」项:

app/config/cache.php
登入後複製

不要低估通过优化查询语句带来的查询速度的提升

就像你看到的,大部分优化都是在不同的层面使用缓存。但当面临数据库优化时,你不应该依赖缓存。缓存应是优化查询的最后手段。

缓存查询结果

MySQL 不会替你做这件事,也不如你自己做的好。当然了你肯定不会把应用中每个查询的结果都做缓存,看看数据统计,在应用程序中那些高频率的查询语句,它们真的有必要被频繁地执行?每 15 分钟运行一次然后把相同的结果提供给用户
不是更好吗?

在查询构造器中移除了 removing方法是件好事(它曾经是个很好的功能,但不够好 - 人们似乎高估了它的作用)。然后你可以更多地使用 Cache::remember 方法,就像这样:

$posts = Cache::remember('index.posts', 30, function()
{
    return Post::with('comments', 'tags', 'author', 'seo')->whereHidden(0)->get();
});
登入後複製

更多Laravel相关技术文章,请访问Laravel教程栏目进行学习!

以上是提高Laravel應用效能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!