Reactor執行緒
Swoole\Server的主程序是一個多執行緒的程式。其中有一組很重要的線程,稱為Reactor線程。它就是真正處理TCP連接,收發資料的線程。
Swoole的主線程在Accept新的連接後,會將這個連接分配給一個固定的Reactor線程,並由這個線程負責監聽此socket。在socket可讀時讀取數據,並進行協定解析,將請求投遞到Worker進程。在socket可寫入時將資料傳送給TCP客戶端。
分配的計算方式是fd % serv->reactor_num
#由於PHP語言不支援多執行緒,因此Swoole使用多進程模式。在多進程模式下存在進程記憶體隔離,在工作進程內修改global全域變數和超全域變數時,在其他行程是無效的。
設定worker_num=1時,不存在進程隔離,可以使用全域變數儲存資料
進程隔離
$fds = array(); $server->on('connect', function ($server, $fd){ echo "connection open: {$fd}\n"; global $fds; $fds[] = $fd; var_dump($fds); });
$fds 雖然是全域變量,但只在目前的進程內有效。 Swoole伺服器底層會建立多個Worker進程,在var_dump($fds)列印出來的值,只有部分連接的fd。
對應的解決方案就是使用外部儲存服務:
#資料庫,如:MySQL、MongoDB
快取伺服器,如:Redis、Memcache
磁碟文件,多進程並發讀寫時需要加鎖
普通的資料庫和磁碟檔案操作,存在較多IO等待時間。因此建議使用:
Redis 記憶體資料庫,讀寫速度非常快
/dev/shm 記憶體檔案系統,讀寫操作全部在記憶體中完成,無IO消耗,效能極高
除了使用儲存之外,還可以使用共享記憶體來保存資料
推薦學習: swoole影片教學
以上是swoole支援多執行緒嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!