高配機器選靜態為何不在PHP-FPM下做代碼連接池?

電腦雜談  發布時間:2021-03-12 06:02:20  來源:網絡整理

通常來說,對于具有更大內存的服務器,將其設置為靜態將提高效率。由于頻繁切換時php-fpm進程有時會滯后,因此當內存足夠大時最好打開靜態效果。數量也可以根據RAM / 30M獲得。例如,可以將2GB的內存服務器設置為50;將2GB的內存服務器設置為50??梢詫?GB內存設置為100,依此類推。高配置計算機選擇靜態,低配置計算機(節省內存)選擇動態,高配置計算機無法充分利用內存資源和CPU資源,也無法及時響應瞬時高并發性。

2.如何處理和驗證請求

PHP-FPM的過程管理方法與Nginx相似。在處理請求時,主進程不接受請求,然后將其轉移到子進程,但是子進程“搶先”接受用戶請求。從本質上講,PHP-FPM多進程和Nginx多進程在主進程偵聽同一個端口后,fork子進程達到了多個進程偵聽同一個端口的目的。

Linux系統的所有進程IO操作都需要處理操作系統。換句話說,系統知道所有IO操作。這個過程就是我們通常所說的“系統調用”。我們可以從系統調用開始解決這個問題。要查看系統調用,可以使用Strace。

如何驗證相對簡單,我們可以采取兩種方式:

3.為什么不在PHP-FPM下建立代碼連接池?

首先,在PHP-FPM模式下,請求的生命周期注定只能是一次。換句話說,從FPM請求到請求,PHP腳本解析,到FPM的Zend虛擬機分配執行資源,然后到最終處理結束,PHP-FPM將回收該請求的所有資源。

第一種方法是使開發人員不必關心資源的回收,因此您可能不必關心關閉網絡,關閉文件描述符等等。第二個是減少內存溢出。

在這種模式下,如果實現連接池,則也意味著請求已結束,連接池消失,并且您做了無用的工作。

“無味” PConnect(永久鏈接)。持久鏈接表示未釋放該鏈接。但是問題在于PHP-FPM是一種多進程模式,并且持久鏈接存在于該進程中。這意味著,如果一臺計算機具有300個FPM進程,則將立即初始化300個持久性鏈接。如果由于業務活動的需要而急速擴展了計算機,則業務的連接數很可能會直接滿。

4.如何優化性能

首先,我們應該考慮性能不佳的可能原因。如果應用程序的性能很差,我們傾向于從兩個方面進行分析,一個是IO性能,另一個是計算性能。

就IO而言,由于很難在PHP-FPM模式下進行連接池,因此高并發服務下的網絡處理將具有缺點。請注意,我在這里所說的是在PHP-FPM模式下進行的,您仍然可以在CLI模式下自行進行連接池化。但是此連接池僅限于CLI模式下的單個進程,并且該模式不能用于處理網絡請求(例如HTTP請求)。由于PHP默認為單進程模式,因此FPM和CLI是默認的單進程。即使CLI可以用作連接池,但執行鏈接保持活動并不方便(無法同時進行心跳檢測)。

就計算性能而言,盡管PHP是用C編寫的,但是如果它純粹是關于計算性能的,那是很好的。但是問題是,PHP處理請求時,必須解析PHP腳本,將PHP代碼轉換為Opcode,然后使用Zend虛擬機執行Opcode。處理結束并且資源被釋放。經歷這樣的過程是導致PHP計算性能下降的最大原因之一。

如何優化:

關于設計合格的Logger組件,我們需要注意以下幾點:

①每個請求僅執行一次日志寫入操作。每次有人調用您的函數時,請勿執行類似于file_put_contents的操作。

②兼容各種相似的錯誤。換句話說,即使發生PHP致命錯誤,您也必須能夠在眾所周知的錯誤之前記錄日志??梢栽赑HP類的destructor方法的幫助下完成此實現。您也可以使用更好的register_shutdown_function來注冊一個鉤子。當PHP請求結束時,請回調此掛鉤以完成最終的日志操作。

5.為什么YAC無法通過CLI模式共享內存

我們知道在PHP擴展開發中要執行的第一個宏是PHP_MINIT_FUNCTION。 PHP-FPM進程啟動時,YAC擴展需要初始化一塊共享內存,以供每個進程共享和使用。因此,實現共享的關鍵是擁有與所有進程相同的標識符。

YAC擴展的初始化過程為:

讓我們檢查一下create_segments的具體實現:

在這里插入圖片描述

上面已經做了一些注釋。最重要的是打開shared_segment_name,這是打開共享內存所需的系統ID。此值包含進程ID。即,PHP-FPM的主進程ID。具有相同的共享內存標識ID是PHP-FPM模型中所有進程之間進行通信的秘密。而且,如果我們想使用yac擴展名通過PHP腳本讀取此共享內存,我們將執行以下操作:

在CLI模式下,不可能在PHP-FPM模式下獲取共享內存數據集。因為在CLI模式下執行的PHP腳本和進程ID與PHP-FPM模式下的進程ID完全不同。

在以下文章中,我們將尋找機會討論進程間通信和基于共享內存的通信??傊?,如果多個進程要共享內存通信,則必須從頭開始協調唯一的ID。在多個進程之間必須知道此ID。 PHP-FPM是一個多進程,主進程派生子進程,并且子進程自然知道此唯一ID是什么(因為Linux進程派生了整個進程的堆棧內存)。但是,以這種方式執行php a.php實際上是一個完全獨立的過程,與PHP-FPM無關。對于這樣的過程,不可能知道PHP-FPM過程中的唯一ID是什么。


本文來自電腦雜談,轉載請注明本文網址:
http://www.tjhwsrq.com/a/shoujiruanjian/article-363949-1.html

    相關閱讀
    發表評論  請自覺遵守互聯網相關的政策法規,嚴禁發布、暴力、反動的言論

    熱點圖片
    拼命載入中...
    欧洲熟妇牲交_亚洲国产在线2020最新_日本无吗无卡v免费清高清