在onMessage中把業(yè)務(wù)邏輯拆分出來比較好的實現(xiàn)方式是什么?
在同一進程中,如何做到連接之間不相互污染數(shù)據(jù)?
================================
剛剛測試了一下同一個進程中在其中的一個連接發(fā)送阻塞標識信息,執(zhí)行for600W次的file_put_contents寫入操作,其他連接發(fā)送消息會被掛起,甚至會出現(xiàn)超時,
process_timeout:
#1 /data/gateway/gateway/vendor/workerman/workerman/Events/Select.php(263): pcntl_signal_dispatch()
#2 /data/gateway/gateway/vendor/workerman/workerman/Worker.php(2231): Workerman\Events\Select->loop()
#3 /data/gateway/gateway/vendor/workerman/gateway-worker/src/BusinessWorker.php(197): Workerman\Worker->run()
#4 /data/gateway/gateway/vendor/workerman/workerman/Worker.php(1356): GatewayWorker\BusinessWorker->run()
#5 /data/gateway/gateway/vendor/workerman/workerman/Worker.php(1188): Workerman\Worker::forkOneWorkerForLinux(Object(GatewayWorker\BusinessWorker))
#6 /data/gateway/gateway/vendor/workerman/workerman/Worker.php(1162): Workerman\Worker::forkWorkersForLinux()
#7 /data/gateway/gateway/vendor/workerman/workerman/Worker.php(1490): Workerman\Worker::forkWorkers()
#8 /data/gateway/gateway/vendor/workerman/workerman/Worker.php(1439): Workerman\Worker::monitorWorkersForLinux()
#9 /data/gateway/gateway/vendor/workerman/workerman/Worker.php(480): Workerman\Worker::monitorWorkers()
#10 /data/gateway/gateway/start.php(37): Workerman\Worker::runAll()
這樣一來是不是我們無須考慮高并發(fā)帶來的同一進程中的多個鏈接在業(yè)務(wù)流程中的數(shù)據(jù)污染,因為同一時間同一個進程永遠在處理一個連接的業(yè)務(wù)?是不是可以這樣理解?
單個進程里業(yè)務(wù)代碼是串行執(zhí)行的,業(yè)務(wù)代碼都是在函數(shù)/類方法中運行,執(zhí)行過程中產(chǎn)生的臨時變量在函數(shù)/類方法執(zhí)行完畢后會自動釋放,不會有多個業(yè)務(wù)代碼并發(fā)執(zhí)行同時訪問更改進程內(nèi)某變量的情況。
但是全局變量以及類的靜態(tài)成員存儲的數(shù)據(jù)默認不會被自動系統(tǒng)釋放,所以多個連接的多個請求可以共享全局變量以及類的靜態(tài)成員存儲的數(shù)據(jù),但是也不會出現(xiàn)多個業(yè)務(wù)代碼并發(fā)訪問的情況,仍然是順序執(zhí)行,進程內(nèi)的所有變量不用考慮并發(fā)問題。
雖然單個進程內(nèi)部業(yè)務(wù)代碼是串行執(zhí)行,無并發(fā)訪問問題,但是多個進程的業(yè)務(wù)代碼是并發(fā)執(zhí)行的(進程間的變量是隔離的,變量同樣沒有并發(fā)訪問問題),但是要注意多個進程讀寫外部存儲(mysql/redis)的并發(fā)問題。