php使用swoole的應用場景有:1、即時收集定位資料並即時輸出,需要將所有的定位設備即時的接收,將即時的軌跡記錄顯示在地圖上;2、只收集定位設備入庫,需要把所有的定位設備上傳的資料入庫。
php使用swoole的應用程式場景有:
場景1 - 即時收集定位資料即時輸出(例滴滴司機行車軌跡)
說明:
需要將所有的定位裝置即時的接收,將即時的軌跡記錄顯示在地圖上
#注意點:
第一點:
web1伺服器連線的使用者1,2,3,web1廣播訊息時只能廣播使用者1,2,3,不能廣播web2連線的用戶4,5,6,假設場景是聊天,用戶1發送一訊息,只有web1 伺服器的用戶能看到,web2的用戶全部不能收到
第二點:訊息的頻率控制,例:100個設備,100個用戶, 100個設備每秒上傳一條數據,需要即時廣播給每個用戶,就是每秒要100*100 = 1W次,所以可以匯總每秒數據廣播給所有使用者等等方法
場景2 - 只收集定位裝置入庫
說明:需要把所有的定位裝置上傳的資料入庫,設備7個,每秒一條數據,個人使用swoole 的task 函數(投遞一個異步的任務到task_worker池中,此函數是非阻塞的, worker進程數同樣可以配置) 後調用接口方式入庫
伺服器記憶體警報問題
原因: 在於swoole_server->task
函數
官方介紹task底層使用Unix Socket管道通信,是全內存的,沒有IO消耗。單一進程讀寫效能可達100萬/s,不同的進程使用不同的管道通信,可最大化利用多核心。
但這任務如果是呼叫程式介面時,由於網路的延遲,增加的任務大於消費的任務時,記憶體佔用會持續的增加,導致伺服器的記憶體被佔滿。
解決方法:訊息針對入任務的頻率控制,可以根據自己的業務場景定義這個時間與是否可延遲等情況,匯總1秒內的所有資料再調用程式介面(匯總時個人使用redis ),最好能直接入庫,不必呼叫介面
簡單程式碼片段
function __construct($config) { $this->config = $config; $this->serv = new Swoole\Server($config['server']['host'], $config['server']['port']); // 连接redis $this->redis = new Predis\Client($config['redis']); $this->storage = new Storage($this->config); $this->serv->set([ 'worker_num' => $this->config['server']['workerNum'], //工作进程数量 'daemonize' => $this->config['server']['daemonize'], //是否作为守护进程 'task_worker_num' => $this->config['server']['taskWorkerNum'], ]); $this->serv->on('connect', function ($serv, $fd){ $this->onConnect($fd, $serv); }); $this->serv->on('receive', function ($serv, $fd, $from_id, $data) { $this->onReceive($fd, $serv, $data); }); $this->serv->on('Close', function($server, $fd) { $this->onClose($fd, $server); }); $this->serv->on('Task', function($server, $task_id, $from_id, $data) { $this->onTask($server, $task_id, $from_id, $data); }); $this->serv->on('Finish', function($server, $task_id, $data) { $this->onFinish($server, $task_id, $data); }); $this->serv->start(); } public function onTask($serv, $task_id, $from_id, $data){ // insert 方法是通过接口入库 $this->storage->insert($data); } public function onReceive($fd, $serv, $data) { $this->storage->writeLog('message:'.$data); $data = $this->formatData($data, $fd); $serv->task($data); } public function onClose($fd, $serv) { // writeLog 方法是写入log $this->storage->writeLog('close fd:'.$fd); } public function onFinish($serv, $task_id, $data) { return ''; }
#相關學習推薦:PHP程式設計從入門到精通
以上是php使用swoole的應用場景有哪些?的詳細內容。更多資訊請關注PHP中文網其他相關文章!