php使用swoole的應用場景有哪些?

2020-07-16 10:06:27

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次,所以可以匯總每秒資料廣播給所有使用者等等方法

2f08f5f6a61d57579d2158fbf7309f5.png

場景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 SwooleServer($config['server']['host'], $config['server']['port']);
    // 連線redis
    $this->redis = new PredisClient($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使用swoole的應用場景有哪些?的詳細內容,更多請關注TW511.COM其它相關文章!