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