ELF PHP 可執行程式執行後載入重型指令碼的過程

NiZerin發表於2021-02-01

本文作者:learnku.com/users/41667

PS:本文就是用於回答我朋友的問題【本文以渣男角度陳述】
重型:是指php 可執行檔案執行後,會呼叫大量的檔案操作函式【如open,read等】讀取大量的php文字檔案
【本文不按套路陳述用法也不講用法,不適合小白,本文只是傳達一個標題的概念】
本文的環境:linux+php+nginx 其它沒有了【本人是渣男,不會遵守任何官方相應條款】
【本文需要你看完以自己去架著轟炸機去測試php-fpm】
安裝流程
1 去這裡下載 【當然你老實本份就composer create-project laravel/laravel,我是渣男不老實,聽說人家不喜歡老實人】
圖片.png

圖片.png
2 安裝
圖片.png

它安裝時會讀取composer.json等檔案去下載類庫檔案,所以你如果安裝時遇到各種問題,可以修改composer.json決定要裝什麼東西,人家說php版本必須是高版本才能裝laravel8【這一般是老實的人才會遵守的條款,我是渣男,肯定不會遵守老外的條款】

3 然後瞎配置一下nginx[它會把資料發給php]
圖片.png

4 啟動服務
nginx只是轉發請求給php-fpm處理而已,畢竟這是老傳統了,當你願意遵守這個傳統條款時。
圖片.png

5 然後我先老實的訪問一下
圖片.png
圖片.png
圖片.png

6 以上是老實做法,下面我們根據提示調整引數
這些配置引數不用記,記來幹什麼?用來面試別人?真是老實人。
圖片.png

然後重啟服務 ,再來老實的訪問
圖片.png

然後出現這種,一般這種情況老實人就比較緊張了,怕人家強暴一樣的緊張。我們現在看一下php-fpm程式執行的情況

圖片.png

上面圖中我圈出的就是重點,你硬是看不懂,我沒有辦法了。 要不599找我手把手教你吧。^_^

接下來根據它的提示調整一下
圖片.png

我們調整好以後,再訪問
圖片.png

這個時候你也別緊張兮兮,我們看一下php-fpm執行laravel的情況再說話,不要像怨婦一樣上來就是啊,怎麼辦?

圖片.png

我們看到這php-fpm在執行laravel時,開啟的指令碼檔案那是相當多,我這裡只是截圖部分,為了處理一個小小的訪問,它開啟一堆指令碼檔案,後面它直接去訪問500這個檔案了。很不給面子。

圖片.png

圖片.png

7 接下來,我們一步步的看一下我執行,php-fpm為了處理這個重型框架到底載入了多少php指令碼檔案【部分截圖】【自己用電腦看,不要用小的可憐兮兮的手機看,渣男就應該用PC看】

圖片.png
圖片.png
圖片.png
圖片.png
圖片.png
圖片.png

路由註冊服務
圖片.png

Kernel 核心檔案
圖片.png

好了,我們不是要研究框架的執行機制,我們現在先看一下500報錯頁面的載入
圖片.png
圖片.png

大家可以看到,一個小小的業務需求,它就載入一大堆的【open,read,lstat,close檔案,這些操作都是要去磁碟裡讀取,框架越重,php-fpm處理時間越長,當然了php-fpm本身是個守護程式,接收一次tcp連線和資料傳輸後,它就斷開了】在這裡大家可以自行的進行測試,從框架的index.php到最後輸出,開啟了N個檔案,都是要操作磁碟,讀取的資料當然是要佔用記憶體,c會申請一堆記憶體再去處理這些指令碼的語法,進行解析。

8 下面隨便給你們看下問題所在
圖片.png

看一下它寫的內容就知道問題在哪裡了
write(4, “[2021-01-29 10:47:15] production.ERROR: No application encryption key has been specified. {“exception”:”[object] (I
這句話看不懂,那就比較老火了。
你們有興趣就去看一下它的加密註冊服務程式碼
圖片.png

解決一下
圖片.png

我不老實,不按上面解決,按渣男方式解決
圖片.png
再訪問時
圖片.png
手動寫一個
圖片.png
圖片.png

下面測試一下

圖片.png
改成這吊樣
圖片.png

請求過程
圖片.png
圖片.png

最後一把
圖片.png
圖片.png
//請求
圖片.png

路由註冊
圖片.png

控制器排程
圖片.png

響應
圖片.png
圖片.png
圖片.png

php-fpm和nginx執行時系統呼叫情況【響應北風之神內容的分析】
【統計誤差很小,大家可以自行統計】
1 系統呼叫時產生的記錄日誌大小
圖片.png
php-fpm執行時的系統呼叫產生:1.4M
ngninx:1.5M

圖片.png

open 開啟php指令碼檔案次數
圖片.png
圖片.png

open 開啟php指令碼後read讀取指令碼內容次數
圖片.png

read php指令碼時大概讀取多少個位元組
圖片.png
圖片.png

根據公式換算一下:
1M=1024KB
1KB=1024Byte
1M=1024*1024=1000,000
1362477=1330KB=1M

php-fpm響應給nginx位元組數
圖片.png
圖片.png
nginx響應給使用者的位元組數
圖片.png

ELF PHP 可執行程式執行後載入重型指令碼的過程

本作品採用《CC 協議》,轉載必須註明作者和本文連結
By: Laravel-China 寧澤林 Blog: nizer.in

相關文章