首先,我認為透過返回最基本的Hello world!
字串,是所有以Laravel
為框架的專案中,最基本的一個請求過程。除此以外,專案中的任何http
請求,都會帶有更多的業務邏輯和資料庫查詢等耗時操作,且這些邏輯的執行時間都是不可控和不可對比的。也就是說,其他任何請求都不會比返回一個Hello world!
字串更短的時間了。所以,透過對比這個最基本的Hello world
請求響應時間,我們可以看出,不同的最佳化對於Laravel
框架從啟動到執行結束的影響。
引數 | 版本 |
---|---|
伺服器 | 1c處理器,1G記憶體,1M頻寬 |
PHP版本 | 8.0 |
程式管理 | PHP-FPM |
可以看出,在安裝PHP
後,預設配置情況下,返回一個Hello world!
平均需要140ms
左右。接下來,我們開始搞事情了!
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
的快取對於最基礎的請求,沒有明顯的影響。
這次,我決定使用提速效果最明顯的手段:開啟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!
的響應時間:
OHHHHHH!效果太明顯了,一下子降到 30ms
以內,提升足足有將近 5 倍 的響應時間。注意一下,在第一次請求時,會比較慢,是因為opcache
在寫快取導致的,訪問過一次以後,速度就飛起了。到這裡你就滿足了嗎?看看文章標題,我們要進一步加大力度!
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
擴充套件後的應用。再看下請求的響應時間:
好傢伙!直接幹到15ms
以內。這裡第一次時間較長,是因為開了opcache
的原因,會寫入快取。但這裡的opcache
寫快取,要比Round 2
那個只開啟opache
擴充套件要快很多,這都是swoole
的功勞。
我又測試了一下,單獨只啟用swoole
擴充套件,不啟用opcache
,發現響應時間和兩個擴充套件都開啟的響應時間一樣。也就是說,有了swoole
後,opcache
就沒用了?這個還得請各位大佬指點了。這裡簡單的做個對比:
透過實踐對比,發現同時開啟opcache
和swoole
擴充套件,是響應時間最快的。
感謝 @Hesunfly 的解答。有時在命令列中用
php -i
模式檢視擴充套件資訊,和在頁面中使用phpinfo()
檢視的擴充套件資訊會有不一致的情況。這裡引用下 @Hesunfly 原話:
「有的發行版確實是cli
和fpm
的配置公用的,例如 mac 使用 brew 安裝的 php 就是隻有一個php.ini
。 但是我在 centos 和 ubuntu 下安裝的一般是區分了cli
和fpm
的。」
本作品採用《CC 協議》,轉載必須註明作者和本文連結