ホームページ > バックエンド開発 > PHPの問題 > PHP で swoole を使用するためのアプリケーション シナリオは何ですか?

PHP で swoole を使用するためのアプリケーション シナリオは何ですか?

coldplay.xixi
リリース: 2023-03-01 20:06:01
オリジナル
3734 人が閲覧しました

php swoole を使用するアプリケーション シナリオは次のとおりです: 1. 測位データをリアルタイムで収集し、リアルタイムで出力します. すべての測位デバイスはリアルタイムで受信する必要があり、リアルタイムの実績が画面に表示されます。地図; 2. 測位デバイスのみが収集される 保存するには、すべての測位デバイスによってアップロードされたデータがデータベースに保存される必要があります。

PHP で swoole を使用するためのアプリケーション シナリオは何ですか?

#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 秒あたりのデータを要約して、すべてのユーザーやその他の方法にブロードキャストできます

PHP で swoole を使用するためのアプリケーション シナリオは何ですか?

シナリオ 2 - のみ測位デバイスをデータベースに収集する

手順: すべての測位デバイスをアップロードする必要があります。データはデータベースに保存され、7 台のデバイスと 1 秒あたり 1 つのデータが保存されます。私は個人的に swoole のタスク関数を使用しています (非同期タスクを task_worker プールに配信します。この関数はノンブロッキングであり、ワーカー プロセスの数も構成できます)、インターフェイスを呼び出してデータベースに保存します。

サーバー メモリ アラームの問題

原因:

swoole_server->task Function

タスクの最下層がフルメモリである Unix ソケット パイプ通信を使用することが正式に導入されています。はい、IO 消費はありません。単一プロセスの読み取りおよび書き込みパフォーマンスは 100 万/秒に達する可能性があり、異なるプロセスは異なるパイプラインを使用して通信するため、複数のコアを最大限に活用できます。

しかし、タスクがプログラム インターフェイスを呼び出す場合、ネットワーク遅延により、追加されたタスクが消費されたタスクよりも大きい場合、メモリ使用量は増加し続け、サーバーのメモリがいっぱいになります。

解決策: タスクに入るメッセージの頻度を制御します。この時間を定義し、独自のビジネス シナリオに従って遅延できるかどうかを定義し、すべてのデータを 1 秒以内に要約してから、プログラム インターフェイス (I) を呼び出します。個人的には、要約するときに 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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート