mysql异步非阻塞方式_如何理解swoole异步非阻塞?
傳統(tǒng)的apache2handler或php-fpm本質(zhì)上都是短生命周期(請(qǐng)求后釋放資源)的FastCGI運(yùn)行模式. 請(qǐng)求來了,master進(jìn)程會(huì)調(diào)用worker進(jìn)程來處理,處理完后釋放資源. 假設(shè)你在functions.php里定義了1000個(gè)函數(shù),那么每次請(qǐng)求,都要重新定義一次,有一定的性能損失. 好處則是修改保存代碼后,下一個(gè)請(qǐng)求立即生效. 不過,PHP內(nèi)置了opcache擴(kuò)展,可以把functions.php對(duì)應(yīng)的二進(jìn)制中間碼opcode緩存在內(nèi)存,避免每個(gè)請(qǐng)求重復(fù)解析一次functions.php. 每次請(qǐng)求,只需重新執(zhí)行一次functions.php對(duì)應(yīng)的opcode指令. 另外,為了避免每次請(qǐng)求都重復(fù)建立MySQL/Redis等外部資源的連接,PHP引入了持久連接的機(jī)制. 讓內(nèi)存常駐的Apache工作進(jìn)程或者PHP-FPM工作進(jìn)程來維持到MySQL/Redis的長連接, 下次代碼中出現(xiàn) new PDO() 或者 new Redis() 時(shí),連接存在則直接返回,連接超時(shí)斷開則自動(dòng)重連并返回. 這些操作對(duì)PHP開發(fā)者來說是透明的,但也有一些注意事項(xiàng),因?yàn)橐粋€(gè)MySQL長連接對(duì)應(yīng)一次MySQL會(huì)話, MySQL會(huì)話中修改的東西(比如事務(wù)是否自動(dòng)提交)會(huì)影響到下一次請(qǐng)求.
而Swoole內(nèi)置的服務(wù)器(HTTP/WebSockets/MQTT/TCP/UDP),需要運(yùn)行在php-cli下,是一個(gè)php-cli下的daemon守護(hù)進(jìn)程服務(wù). 也就是說,PHP邏輯是內(nèi)存常駐的,服務(wù)啟動(dòng)后,只需加載和執(zhí)行一次functions.php. 所以在函數(shù)和類以及其他全局資源的定義上,內(nèi)存常駐的服務(wù)有性能優(yōu)勢. 但缺點(diǎn)是修改functions.php代碼,必須重啟PHP服務(wù)才能生效.
除了內(nèi)存常駐外,異步當(dāng)然也是Swoole高性能的一個(gè)原因,也是Swoole核心競爭力所在. 但需要明確的是,異步是用來解決IO阻塞的場景的有效手段,所以異步最直觀的性能優(yōu)勢就是: 無需多線程,一個(gè)進(jìn)程在同一時(shí)間就能維持成千上萬(C10K)甚至百萬(C1000K)個(gè)連接,這就是所謂的"并發(fā)". 另外,Swoole也內(nèi)置了很多異步的客戶端(HTTP/Redis/MySQL等),用這些客戶端能夠異步發(fā)起多個(gè)請(qǐng)求訪問外部資源(API),而不會(huì)阻塞當(dāng)前工作進(jìn)程. 而且,Swoole還內(nèi)置了異步毫秒定時(shí)器,讓開發(fā)者在PHP里實(shí)現(xiàn)定時(shí)任務(wù)變得輕而易舉. 還有,Swoole內(nèi)置了task進(jìn)程池,能讓開發(fā)者把CPU計(jì)算密集或其他一些還沒有實(shí)現(xiàn)異步的操作(比如SMTP發(fā)送郵件)放到task進(jìn)程池里跑, 避免阻塞worker進(jìn)程,讓worker盡量保持異步非阻塞的狀態(tài). 總而言之,Swoole就是盡量利用異步思想來減少阻塞對(duì)服務(wù)吞吐量的影響,從而提升性能.
Swoole高性能的三大因素:
底層用C實(shí)現(xiàn) + PHP邏輯內(nèi)存常駐 + 異步服務(wù)器端和客戶端
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的mysql异步非阻塞方式_如何理解swoole异步非阻塞?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 银元宝多少钱啊?
- 下一篇: 极米Z5投影仪怎么样,效果好吗?