這篇文章主要講解了“php對(duì)象池、連接池的意義是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“php對(duì)象池、連接池的意義是什么”吧!
我們提供的服務(wù)有:成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、東港ssl等。為近1000家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的東港網(wǎng)站制作公司
nginx采用多進(jìn)程模型,啟動(dòng)之后的進(jìn)程將包含一個(gè)master
和多個(gè)worker
進(jìn)程。
master是worker的父進(jìn)程,主要職責(zé)是用來管理worker進(jìn)程的。
向worker進(jìn)程發(fā)送信號(hào),如通知退出
監(jiān)控worker狀態(tài),當(dāng)worker退出后(無論正常異常),可以重新啟動(dòng)新的worker。
可以實(shí)現(xiàn)
從容重啟
:master進(jìn)程在接收到信號(hào)后,會(huì)先重新加載配置,然后再啟動(dòng)新進(jìn)程開始接收新請(qǐng)求,并向所有老進(jìn)程發(fā)送信號(hào)告知不再接收新請(qǐng)求并在處理完所有未處理完的請(qǐng)求后自動(dòng)退出。
worker進(jìn)程負(fù)責(zé)處理請(qǐng)求,如果是靜態(tài)文件則可以直接處理完,如果是php程序還需要調(diào)用php來處理,當(dāng)php處理完成時(shí)獲取php的返回,并返回給客戶端。
采用的是異步非堵塞
,當(dāng)調(diào)用php的時(shí)候不會(huì)堵塞等待,會(huì)抽空處理下一個(gè)請(qǐng)求,當(dāng)php處理完成時(shí)恢復(fù)之前的請(qǐng)求并返回給客戶端。
php-fpm是php-cgi的管理器,在php >= 5.3.3
就已經(jīng)集成在php中了。
它的出現(xiàn)提供了更好的php管理方式
可以平滑停止/啟動(dòng)php進(jìn)程(重載配置生效)
可以配置監(jiān)控多個(gè)端口和使用不同的配置
php腳本的解釋器是php-cgi
php-fpm是一個(gè)管理器,管理對(duì)象是php-cgi
php-fpm實(shí)現(xiàn)了fastcgi協(xié)議,當(dāng)php-fpm啟動(dòng)時(shí),會(huì)啟動(dòng)多個(gè)cgi解釋器進(jìn)程。
web服務(wù)器可以發(fā)送數(shù)據(jù)給php-fpm,php-fpm再把數(shù)據(jù)發(fā)給php-cgi處理。(跟nginx發(fā)送數(shù)據(jù)給php-fpm類似)
常駐內(nèi)存程序
是指把自己裝入內(nèi)存后將控制返回給操作系統(tǒng),直到運(yùn)行結(jié)束、異常、用戶手動(dòng)退出才會(huì)中斷運(yùn)行的程序。
當(dāng)程序運(yùn)行時(shí),對(duì)象和變量將會(huì)一直存在。除非在程序中釋放銷毀。
當(dāng)我們new一個(gè)對(duì)象的時(shí)候,需要先經(jīng)過這幾個(gè)步驟:類加載檢查、分配內(nèi)存空間、設(shè)置類的基本信息、調(diào)用初始化構(gòu)造函數(shù)。
首先我們看看構(gòu)造函數(shù)
這一塊,這是在代碼中按我們的需求和意愿編寫的。
在這一塊中我們經(jīng)常會(huì)做一些配置檢測、數(shù)據(jù)初始化、數(shù)據(jù)庫連接(網(wǎng)絡(luò)io)等。
接下來是分配內(nèi)存空間
OS的內(nèi)存分配器一般是預(yù)先向OS申請(qǐng)一大段內(nèi)存。然后每次分配時(shí),再將里面的一小段標(biāo)記為已分配
,釋放的時(shí)候再標(biāo)記成未分配。
由于是有很多程序在運(yùn)行,所以分配和釋放會(huì)交替存在,得到的結(jié)果可能是 分配1段-未分配1段-分配2段-未分配2段
一個(gè)一個(gè)的未分配
就是內(nèi)存碎片,會(huì)占用額外的內(nèi)存,碎片不一定可以馬上被重復(fù)使用(當(dāng)分配不出連續(xù)內(nèi)存時(shí),需要向OS申請(qǐng)更多的內(nèi)存)
同時(shí),創(chuàng)建和銷毀對(duì)象時(shí),OS都需要做一些處理工作,也會(huì)產(chǎn)生資源占用。
若程序未產(chǎn)生IO(網(wǎng)絡(luò)請(qǐng)求、讀寫文件等),執(zhí)行時(shí)間等于cpu的占用時(shí)間。
頻繁地創(chuàng)建銷毀對(duì)象將會(huì)占用更多cpu資源,高并發(fā)時(shí)容易導(dǎo)致cpu長期處于高負(fù)載運(yùn)行狀態(tài)。
對(duì)象池就是一個(gè)在程序啟動(dòng)的時(shí)候先創(chuàng)建好若干個(gè)可以重復(fù)使用的對(duì)象。
當(dāng)程序其他地方需要使用該類型對(duì)象時(shí),不再是向系統(tǒng)申請(qǐng)創(chuàng)建,而是向池發(fā)出請(qǐng)求。
池將會(huì)從池內(nèi)發(fā)配出一個(gè)對(duì)象提供使用,當(dāng)程序使用完畢后,需要將對(duì)象歸還給對(duì)象池做管理。
對(duì)象池服務(wù)可以減少從頭創(chuàng)建每個(gè)對(duì)象的系統(tǒng)開銷。
<?phpfunction db(){return mysqli_connect("localhost","root","root"); }for ($i=0; $i < 10000; $i++) { $name = "db{$i}";$$name = db();}
這一個(gè)demo將會(huì)產(chǎn)生報(bào)錯(cuò):Warning: mysqli_connect(): (08004/1040): Too many connections
我們習(xí)慣性地在PHP腳本中不會(huì)主動(dòng)關(guān)閉mysql連接,而是等到腳本運(yùn)行完畢之后再由gc自動(dòng)回收。在這個(gè)期間將會(huì)繼續(xù)占用連接資源,而連接資源的數(shù)量又是有限制的,所以會(huì)更快出現(xiàn)連接不夠用的情況。
處理會(huì)影響程序的運(yùn)行,同時(shí)還將可能導(dǎo)致全站崩潰
。
mysql是一個(gè)連接創(chuàng)建一個(gè)線程處理。
創(chuàng)建銷毀mysql線程需要的內(nèi)存等性能消耗、線程緩存命中率下降
mysql底層幾乎在同時(shí)需要處理幾百個(gè)線程提交的查詢請(qǐng)求,而cpu一次只能處理一條指令,并且數(shù)據(jù)庫查詢需要產(chǎn)生IO,在IO期間cpu將會(huì)切換上下文處理其他的請(qǐng)求,當(dāng)cpu頻繁切換上下文,性能抖動(dòng),發(fā)生性能下降甚至宕機(jī)的情況。
連接池是將已經(jīng)創(chuàng)建好的連接保存在池中,當(dāng)有請(qǐng)求來時(shí),直接使用已經(jīng)創(chuàng)建好的連接對(duì)數(shù)據(jù)庫進(jìn)行訪問。
<?phpclass Pool{private $pool = [];private $min = 5;private $max = 100;private $now;public function __construct(){// 在池創(chuàng)建的時(shí)候就先創(chuàng)建好一些連接for ($i = 0 ; $i < $this->min; $i++){$this->pool[] = mysqli_connect("localhost","root","root");$this->now++;}}public function get(){// 這里要判斷當(dāng)前池還有沒有空閑的// 若沒有,則判斷當(dāng)前已經(jīng)提供的服務(wù)數(shù)量大不大于最大數(shù)量 如果還沒有達(dá)到最大數(shù)量 可以向系統(tǒng)再申請(qǐng)一個(gè)資源到池中// 如果已經(jīng)達(dá)到最大數(shù)量,并且池內(nèi)沒有服務(wù)了,則進(jìn)行短暫等等看看有沒有// 需要銷毀避免同一個(gè)連接多處使用,會(huì)沖突$connect = array_shift($this->pool);return $connect;//偽代碼}public function recovery($connect){$this->pool[] = $connect;}}
因?yàn)檫B接池需要長期保持在線,在傳統(tǒng)的php腳本中不支持,在
swoole
中可以常駐內(nèi)存運(yùn)行,即可使用連接池
這樣省略了創(chuàng)建連接和銷毀連接的過程。這樣性能上得到了提高。
然而除了性能上的提高外,還有一個(gè)意義也很重要:保護(hù)服務(wù)穩(wěn)定運(yùn)行,不發(fā)生全站崩潰。
在上面一點(diǎn)我們已經(jīng)提到,更多的鏈接將會(huì)導(dǎo)致cpu頻繁切換上下文,性能抖動(dòng),嚴(yán)重情況時(shí)將會(huì)全站崩潰。
假設(shè)本來我們的服務(wù)器配置是可以保證1000個(gè)連接同時(shí)穩(wěn)定運(yùn)行,突然某一時(shí)刻有3000個(gè)人并發(fā),導(dǎo)致連接不夠用,那么是保證原有1000人都正常運(yùn)行好,還是讓這3000人爭搶資源最終導(dǎo)致機(jī)器響應(yīng)不了全站崩潰好呢?
當(dāng)已經(jīng)有這么多的數(shù)量在服務(wù)的時(shí)候,后面的請(qǐng)求申請(qǐng)連接資源時(shí)需要進(jìn)行短暫的等待,若時(shí)間到了還是沒有空余連接提供,則需要熔斷服務(wù),返回給客戶端失敗。
這樣子可以保證機(jī)器長期穩(wěn)定服務(wù)。若是越來越多的客戶端申請(qǐng)不到資源,則需要提高機(jī)器配置。(因?yàn)槲覀兊倪B接池最大數(shù)量已經(jīng)是機(jī)器的瓶頸,只能通過硬件配置來提升能服務(wù)的數(shù)量)
在最開始的時(shí)候已經(jīng)介紹過nginx和php的運(yùn)行進(jìn)程模型,php-fpm就是一個(gè)池管理器,內(nèi)部裝了若干個(gè)php-cgi程序,當(dāng)nginx申請(qǐng)解析php腳本時(shí),php-fpm則分配一個(gè)php-cgi出去處理,處理完則收回管理。
在高并發(fā)下,nginx會(huì)產(chǎn)生504錯(cuò)誤,這就是我們上面介紹到的,客戶端進(jìn)行了短暫的 等待
后,仍然申請(qǐng)不到資源,則只能告訴客戶端失敗。
(在京東、淘寶的大活動(dòng)期間很有機(jī)會(huì)碰到504錯(cuò)誤哦! 這種情況下我們一般只需要刷新頁面即可。 因?yàn)樵偎⑿聲r(shí)大幾率已經(jīng)有連接資源空閑了?。?/p>
Nginx 504 Gateway Time-out的含義是沒有請(qǐng)求到可以執(zhí)行的PHP-CGI。
連接池、對(duì)象池的意義不僅僅是可以減少頻繁創(chuàng)建銷毀對(duì)象連接的性能開銷
更大的意義是可以保證應(yīng)有服務(wù)客戶端的穩(wěn)定運(yùn)行。
感謝各位的閱讀,以上就是“php對(duì)象池、連接池的意義是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)php對(duì)象池、連接池的意義是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
當(dāng)前題目:php對(duì)象池、連接池的意義是什么
文章鏈接:http://jinyejixie.com/article8/iihdip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、網(wǎng)站制作、面包屑導(dǎo)航、全網(wǎng)營銷推廣、品牌網(wǎng)站設(shè)計(jì)、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)