亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php對象池、連接池的意義是什么

發布時間:2021-07-02 17:01:29 來源:億速云 閱讀:241 作者:chen 欄目:編程語言

這篇文章主要講解了“php對象池、連接池的意義是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“php對象池、連接池的意義是什么”吧!

nginx與php-fpm的進程模型

nginx采用多進程模型,啟動之后的進程將包含一個master多個worker進程。

master是worker的父進程,主要職責是用來管理worker進程的。

  • 向worker進程發送信號,如通知退出

  • 監控worker狀態,當worker退出后(無論正常異常),可以重新啟動新的worker。

可以實現從容重啟:master進程在接收到信號后,會先重新加載配置,然后再啟動新進程開始接收新請求,并向所有老進程發送信號告知不再接收新請求并在處理完所有未處理完的請求后自動退出。

worker進程負責處理請求,如果是靜態文件則可以直接處理完,如果是php程序還需要調用php來處理,當php處理完成時獲取php的返回,并返回給客戶端。

采用的是異步非堵塞,當調用php的時候不會堵塞等待,會抽空處理下一個請求,當php處理完成時恢復之前的請求并返回給客戶端。

php-fpm是php-cgi的管理器,在php >= 5.3.3就已經集成在php中了。

它的出現提供了更好的php管理方式

  • 可以平滑停止/啟動php進程(重載配置生效)

  • 可以配置監控多個端口和使用不同的配置

php腳本的解釋器是php-cgi

php-fpm是一個管理器,管理對象是php-cgi

php-fpm實現了fastcgi協議,當php-fpm啟動時,會啟動多個cgi解釋器進程。

web服務器可以發送數據給php-fpm,php-fpm再把數據發給php-cgi處理。(跟nginx發送數據給php-fpm類似)

常駐內存下程序的對象回收

常駐內存程序是指把自己裝入內存后將控制返回給操作系統,直到運行結束、異常、用戶手動退出才會中斷運行的程序。

當程序運行時,對象和變量將會一直存在。除非在程序中釋放銷毀。

高并發下頻繁new對象的資源占用

當我們new一個對象的時候,需要先經過這幾個步驟:類加載檢查、分配內存空間、設置類的基本信息、調用初始化構造函數。

首先我們看看構造函數這一塊,這是在代碼中按我們的需求和意愿編寫的。
在這一塊中我們經常會做一些配置檢測、數據初始化、數據庫連接(網絡io)等。

接下來是分配內存空間

OS的內存分配器一般是預先向OS申請一大段內存。然后每次分配時,再將里面的一小段標記為已分配,釋放的時候再標記成未分配。

由于是有很多程序在運行,所以分配和釋放會交替存在,得到的結果可能是 分配1段-未分配1段-分配2段-未分配2段

一個一個的未分配就是內存碎片,會占用額外的內存,碎片不一定可以馬上被重復使用(當分配不出連續內存時,需要向OS申請更多的內存)

同時,創建和銷毀對象時,OS都需要做一些處理工作,也會產生資源占用。

new太多對象,然后導致cpu負載上線讓全站死機的概念

若程序未產生IO(網絡請求、讀寫文件等),執行時間等于cpu的占用時間。

頻繁地創建銷毀對象將會占用更多cpu資源,高并發時容易導致cpu長期處于高負載運行狀態。

什么是對象池

對象池就是一個在程序啟動的時候先創建好若干個可以重復使用的對象。

當程序其他地方需要使用該類型對象時,不再是向系統申請創建,而是向池發出請求。

池將會從池內發配出一個對象提供使用,當程序使用完畢后,需要將對象歸還給對象池做管理。

對象池服務可以減少從頭創建每個對象的系統開銷。

大并發下多個mysql連接導致mysql繁忙全站崩潰

<?phpfunction db(){return mysqli_connect("localhost","root","root"); }for ($i=0; $i < 10000; $i++) { $name  = "db{$i}";$$name = db();}

這一個demo將會產生報錯:Warning: mysqli_connect(): (08004/1040): Too many connections

我們習慣性地在PHP腳本中不會主動關閉mysql連接,而是等到腳本運行完畢之后再由gc自動回收。在這個期間將會繼續占用連接資源,而連接資源的數量又是有限制的,所以會更快出現連接不夠用的情況。

處理會影響程序的運行,同時還將可能導致全站崩潰

  • mysql是一個連接創建一個線程處理。

  • 創建銷毀mysql線程需要的內存等性能消耗、線程緩存命中率下降

  • mysql底層幾乎在同時需要處理幾百個線程提交的查詢請求,而cpu一次只能處理一條指令,并且數據庫查詢需要產生IO,在IO期間cpu將會切換上下文處理其他的請求,當cpu頻繁切換上下文,性能抖動,發生性能下降甚至宕機的情況。

連接池 保護mysql不崩潰

連接池是將已經創建好的連接保存在池中,當有請求來時,直接使用已經創建好的連接對數據庫進行訪問。

<?phpclass Pool{private $pool = [];private $min = 5;private $max = 100;private $now;public function __construct(){// 在池創建的時候就先創建好一些連接for ($i = 0 ; $i < $this->min; $i++){$this->pool[] = mysqli_connect("localhost","root","root");$this->now++;}}public function get(){// 這里要判斷當前池還有沒有空閑的// 若沒有,則判斷當前已經提供的服務數量大不大于最大數量   如果還沒有達到最大數量  可以向系統再申請一個資源到池中// 如果已經達到最大數量,并且池內沒有服務了,則進行短暫等等看看有沒有// 需要銷毀避免同一個連接多處使用,會沖突$connect = array_shift($this->pool);return $connect;//偽代碼}public function recovery($connect){$this->pool[] = $connect;}}

因為連接池需要長期保持在線,在傳統的php腳本中不支持,在swoole中可以常駐內存運行,即可使用連接池

這樣省略了創建連接和銷毀連接的過程。這樣性能上得到了提高。

然而除了性能上的提高外,還有一個意義也很重要:保護服務穩定運行,不發生全站崩潰。

在上面一點我們已經提到,更多的鏈接將會導致cpu頻繁切換上下文,性能抖動,嚴重情況時將會全站崩潰。

假設本來我們的服務器配置是可以保證1000個連接同時穩定運行,突然某一時刻有3000個人并發,導致連接不夠用,那么是保證原有1000人都正常運行好,還是讓這3000人爭搶資源最終導致機器響應不了全站崩潰好呢?

連接池的意義此時才得以體現,我們設置連接池的最大數量為機器能承受并且穩定運行的最大數量。

當已經有這么多的數量在服務的時候,后面的請求申請連接資源時需要進行短暫的等待,若時間到了還是沒有空余連接提供,則需要熔斷服務,返回給客戶端失敗。

這樣子可以保證機器長期穩定服務。若是越來越多的客戶端申請不到資源,則需要提高機器配置。(因為我們的連接池最大數量已經是機器的瓶頸,只能通過硬件配置來提升能服務的數量)

nginx – php fpm在大并發下504

在最開始的時候已經介紹過nginx和php的運行進程模型,php-fpm就是一個池管理器,內部裝了若干個php-cgi程序,當nginx申請解析php腳本時,php-fpm則分配一個php-cgi出去處理,處理完則收回管理。

在高并發下,nginx會產生504錯誤,這就是我們上面介紹到的,客戶端進行了短暫的 等待 后,仍然申請不到資源,則只能告訴客戶端失敗。

(在京東、淘寶的大活動期間很有機會碰到504錯誤哦! 這種情況下我們一般只需要刷新頁面即可。 因為再刷新時大幾率已經有連接資源空閑了!)

  • Nginx 504 Gateway Time-out的含義是沒有請求到可以執行的PHP-CGI。

總結

連接池、對象池的意義不僅僅是可以減少頻繁創建銷毀對象連接的性能開銷

更大的意義是可以保證應有服務客戶端的穩定運行。

感謝各位的閱讀,以上就是“php對象池、連接池的意義是什么”的內容了,經過本文的學習后,相信大家對php對象池、連接池的意義是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

彩票| 南郑县| 景东| 商河县| 元阳县| 东兰县| 安西县| 嫩江县| 庐江县| 塔河县| 山丹县| 方城县| 南皮县| 渝北区| 杭锦后旗| 克什克腾旗| 壶关县| 丹凤县| 安图县| 张家口市| 梁平县| 陵川县| 太康县| 永登县| 罗江县| 卓尼县| 浮山县| 老河口市| 铜川市| 同心县| 英吉沙县| 绥棱县| 阿拉善左旗| 类乌齐县| 南漳县| 仁怀市| 陇西县| 普格县| 云浮市| 分宜县| 印江|