php swoole を使用するアプリケーション シナリオは次のとおりです: 1. 測位データをリアルタイムで収集し、リアルタイムで出力します. すべての測位デバイスはリアルタイムで受信する必要があり、リアルタイムの実績が画面に表示されます。地図; 2. 測位デバイスのみが収集される 保存するには、すべての測位デバイスによってアップロードされたデータがデータベースに保存される必要があります。
#php swoole を使用するアプリケーション シナリオは次のとおりです。
# シナリオ 1 - リアルタイム収集測位データとリアルタイム出力の統合(Didi ドライバーの運転軌跡の例)
手順: すべての測位デバイスをリアルタイムで受信し、リアルタイムの軌跡を表示する必要がありますマップ上の記録注:
最初のポイント:Web1 サーバーはユーザー 1、2、3 に接続されています。Web1 が情報をブロードキャストするとき、ユーザー 1、2、3 のみをブロードキャストできます。ユーザー 4、5、および 6 は、Web2 接続をブロードキャストできません。シーンがチャットしていると仮定します。ユーザー 1 がメッセージを送信します。Web1 サーバーのユーザーのみがメッセージを表示できます。すべてのユーザー2 番目のポイント: メッセージ頻度の制御、例: 100 台のデバイス、100 人のユーザー、100 台のデバイスが 1 秒あたり 1 つのデータをアップロードし、各ユーザーにリアルタイムでブロードキャストする必要があります。つまり、100*100 = 1 秒あたり 1W 回なので、1 秒あたりのデータを要約して、すべてのユーザーやその他の方法にブロードキャストできますシナリオ 2 - のみ測位デバイスをデータベースに収集する
手順: すべての測位デバイスをアップロードする必要があります。データはデータベースに保存され、7 台のデバイスと 1 秒あたり 1 つのデータが保存されます。私は個人的に swoole のタスク関数を使用しています (非同期タスクを task_worker プールに配信します。この関数はノンブロッキングであり、ワーカー プロセスの数も構成できます)、インターフェイスを呼び出してデータベースに保存します。サーバー メモリ アラームの問題原因:swoole_server->task Function
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 で swoole を使用するためのアプリケーション シナリオは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。