由於PHP語言不支援多線程,因此Swoole使用多進程模式。在多進程模式下存在進程記憶體隔離,在工作進程內修改global全域變數和超全域變數時,在其他行程是無效的。 (建議學習: swoole視訊教學)
设置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是多進程還是多執行緒的詳細內容。更多資訊請關注PHP中文網其他相關文章!