圖片來自互聯網,侵權請聯系刪除
1.為什么你要用swoole,能解決你項目中的哪些痛點?
swoole是一個網絡通訊和異步IO的引擎,一個基礎庫;
swoole相比于apache/fpm,主要節(jié)省了PHP框架和全局對象每次創(chuàng)建銷毀帶來的性能開銷,是進程常駐內存型。
2.你是如何通過swoole提升性能的,怎么做的?
(1).進程常駐內存:
swoole本身是進程常駐內存,在進程啟動的時候就將PHP框架等代碼讀取并編譯完成,不需要每次啟動的時候都執(zhí)行編譯步驟,大大降低了腳本的運行時間;
(2).連接池
php-fpm的模式php因為每次請求結束時都會銷毀所有資源,因此無法使用連接池;而基于swoole的進程常駐內存模式,可以通過連接池的方式來加速程序,
使用連接池既可以降低程序的響應時間,又可以有效保護后端資源。
(3).可以使用協(xié)程處理異步IO
當開發(fā)中需要去請求多處的數據,而每一塊的數據單獨請求都要花較長時間,常規(guī)的php-fpm是阻塞式運行,無法對這類型的數據處理進行加速;而基于swoole的程序,可以將這類的業(yè)務并行化處理,并行去請求后端的數據源,能夠大大優(yōu)化了此類業(yè)務的運行時間。
3.swoole里的協(xié)程是什么,怎么用?為什么協(xié)程可以提高并發(fā)?
協(xié)程是通過協(xié)作而不是搶占的方式來進行切換,它創(chuàng)建和切換對內存等資源比線程小的多(可以理解為更小的線程);
協(xié)程的使用是通過Swoole\Coroutine或者Co\命名空間短命名簡化類名來創(chuàng)建;
協(xié)程可以異步處理任務,支持并發(fā),并且資源消耗小。
4.用了swoole以后,會不會發(fā)生內存泄漏?如果發(fā)生了怎么解決?
swoole由于是常駐內存,一旦資源加載進入后,會一直存在于內存中。對于局部變量,swoole會在回調函數結束后自動釋放;對于全局變量(lobal聲明的變量,
static聲明的對象屬性或者函數內的靜態(tài)變量和超全局變量),swoole不會自動釋放;因此操作不好會發(fā)生內存泄漏。
解決:
(1).在onClose回調內清理變量;
(2).swoole提供了max_request和max_task_request機制:進程完成指定數量的任務后,會自動退出,達到釋放資源和內存的目的;而后manager進程會重新拉起新worker/task進程來繼續(xù)處理任務。
使用限制:
max_request只能用于同步阻塞、無狀態(tài)的請求響應式服務器程序;
純異步的Server不應當設置max_request
使用Base模式時max_request是無效的