如何讓你的Laravel在15毫秒內返回一個"hello world!"

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

下面由laravel教程欄目給大家介紹如何讓你的Laravel在15毫秒內返回一個”hello world!”,希望對需要的朋友有所幫助!

首先,我認為通過返回最基本的hello world!字符串,是所有以laravel為框架的項目中,最基本的一個請求過程。除此以外,項目中的任何http請求,都會帶有更多的業務邏輯和數據庫查詢等耗時操作,且這些邏輯的執行時間都是不可控和不可對比的。也就是說,其他任何請求都不會比返回一個hello world!字符串更短的時間了。所以,通過對比這個最基本的hello world請求響應時間,我們可以看出,不同的優化對于laravel框架從啟動到執行結束的影響。

推薦:最新的五個Laravel視頻教程

測試參數

參數 版本
服務器 1c處理器,1G內存,1M帶寬
PHP版本 8.0
進程管理 PHP-FPM

默認配置響應時間

如何讓你的Laravel在15毫秒內返回一個"hello world!"

可以看出,在安裝PHP后,默認配置情況下,返回一個Hello world!平均需要140ms左右。接下來,我們開始搞事情了!

Round 1:Laravel 緩存

Laravel為我們提供了很方便的artisan命令來開啟緩存功能,有效的減少了文件讀取次數。其中php artisan optimize命令包括了php artisan config:cache和php artisan route:cache命令,但是會多出現一個Files緩存。將下面的 5 個命令依次執行:

root@Aliyun-ECS / # php artisan optimize root@Aliyun-ECS / # php artisan config:cache root@Aliyun-ECS / # php artisan event:cache root@Aliyun-ECS / # php artisan route:cache root@Aliyun-ECS / # php artisan view:cache

我們再看下響應時間:

如何讓你的Laravel在15毫秒內返回一個"hello world!"

可見Laravel的緩存對于最基礎的請求,沒有明顯的影響。

Round 2:開啟 opcache

這次,我決定使用提速效果最明顯的手段:開啟opcache擴展。由于本人是使用的 remi 源安裝的php8,所以我這里安裝opcache擴展會比較容易,其他版本的安裝請自行 Google。

root@Aliyun-ECS / # yum install php80-php-opcache

等待安裝結束后,我們重啟php,然后看下擴展是否已經安裝上:

root@Aliyun-ECS / # systemctl restart php80-php-fpm root@Aliyun-ECS / # php -i|grep opcache.enable opcache.enable => On => On opcache.enable_cli => On => On opcache.enable_file_override => Off => Off

ok,已經開啟opcache擴展了,我門再來看下Hello world!的響應時間:

如何讓你的Laravel在15毫秒內返回一個"hello world!"

OHHHHHH!效果太明顯了,一下子降到 30ms 以內,提升足足有將近 5 倍 的響應時間。注意一下,在第一次請求時,會比較慢,是因為opcache在寫緩存導致的,訪問過一次以后,速度就飛起了。到這里你就滿足了嗎?看看文章標題,我們要進一步加大力度!

Round 3:開啟 swoole

swoole模塊大家都懂,就是將應用程序提前加載到內存中,從而在處理請求時,減少文件的讀取和加載過程,為PHP插上了翅膀。下面安裝swoole擴展,其他版本的請自行 Google。

root@Aliyun-ECS / # yum install php80-php-pecl-swoole

老樣子,安裝完后檢查下是否安裝成功:

root@Aliyun-ECS / # systemctl restart php80-php-fpm root@Aliyun-ECS / # php -i|grep swoole.enable swoole.enable_coroutine => On => On swoole.enable_library => On => On swoole.enable_preemptive_scheduler => Off => Off

擴展已經啟用了,但是還無法進行測試。因為 swoole 是一個 cli 模式下的擴展,php-fpm無法使用。所以我們需要實現一個cli模式下的http應用。但實際上我們無需自己手動編寫http應用,社區中有大佬已經寫好了。所謂「前人種樹,后人乘涼」,我們引入 laravel-swoole 軟件包,再啟動一個http服務即可,很簡單。

// 引入軟件包 root@Aliyun-ECS / # composer require swooletw/laravel-swoole // 發布配置文件 root@Aliyun-ECS / # php artisan vendor:publish --tag=laravel-swoole

執行以上兩步操作后,即可在項目的config目錄下找到swoole_http和swoole_websocket兩個配置文件。一個基本的Hello world!測試,無需修改默認配置,我們只在項目的.env文件中,添加SWOOLE_HTTP_HOST=0.0.0.0和SWOOLE_HTTP_PORT=2020即可,意思是在2020端口啟動一個http監聽程序。0.0.0.0指任何IP都可遠程訪問。

// .env SWOOLE_HTTP_HOST=0.0.0.0 SWOOLE_HTTP_PORT=2020

基本配置修改完成,我們啟動laravel-swoole的http應用:

root@Aliyun-ECS / # php artisan swoole:http start Starting swoole http server...Swoole http server started: <http://0.0.0.0:2020>

此時我們訪問2020端口,即可測試使用swoole擴展后的應用。再看下請求的響應時間:

如何讓你的Laravel在15毫秒內返回一個"hello world!"

好家伙!直接干到15ms以內。這里第一次時間較長,是因為開了opcache的原因,會寫入緩存。但這里的opcache寫緩存,要比Round 2那個只開啟opache擴展要快很多,這都是swoole的功勞。

結語

我又測試了一下,單獨只啟用swoole擴展,不啟用opcache,發現響應時間和兩個擴展都開啟的響應時間一樣。也就是說,有了swoole后,opcache就沒用了?這個還得請各位大佬指點了。這里簡單的做個對比:

如何讓你的Laravel在15毫秒內返回一個"hello world!"

通過實踐對比,發現同時開啟opcache和swoole擴展,是響應時間最快的。

其他問題

  • PHP-FPM進程管理,為什么會創建master進程?不科學呀

感謝

感謝 @Hesunfly 的解答。有時在命令行中用php -i模式查看擴展信息,和在頁面中使用phpinfo()查看的擴展信息會有不一致的情況。這里引用下 @Hesunfly 原話:
「有的發行版確實是 cli 和 fpm 的配置公用的,例如 mac 使用 brew 安裝的 php 就是只有一個 php.ini。 但是我在 centos 和 ubuntu 下安裝的一般是區分了cli 和 fpm 的。」
如何讓你的Laravel在15毫秒內返回一個"hello world!"

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享