まず、接続プールを使用する理由と、接続プールによってどのような問題が解決できるかを理解する必要があります。 接続プールの主な機能は次のとおりです。 1. データサーバーとのTCP接続を確立するための3ウェイハンドシェイクと接続を閉じるための4ウェイハンドシェイクのオーバーヘッドを削減し、クライアントとMySQLサーバーの負荷を軽減し、リクエスト応答時間を短縮します。 2. データベースへの同時接続数を減らす。つまり、アプリケーションサーバーの数が多すぎるためにデータベースへの接続が多すぎるという問題を解決する。 問題を解決するには1 Workerman では、データベース接続プールは最も効率的な方法ではなく、むしろ面倒なアプローチです。 PHP はシングルプロセス、シングルスレッドのプログラムであるため、PHP を使用してデータベース接続プールを実装するには別のプロセスが必要になります。これによりプロセス間通信が発生し、MySQL と直接通信する元のプロセスが接続プールとの通信、そして MySQL との通信に変更され、アプリケーション側の負荷が増加します。 問題 1 を解決する最も効率的な方法は、各ビジネス プロセスにデータベース シングルトン (workerman が提供する DB クラスなど) を作成し、データベースの永続的な接続を実装することです。この方法では、各プロセスのすべての要求が独自のデータベースの永続的な接続を使用します。プロセス ライフ サイクル全体では、TCP ハンドシェイクと切断波のオーバーヘッドが 1 つだけあります。さらに、アプリケーションは、接続プールなどのプロセス間 IPC 通信の中間層なしで、MySQL と直接通信します。パフォーマンスは間違いなく最高です。 質問2の場合 まず、アプリケーション サーバーがいくつあるか、また各サーバーが MySQL と同時接続できる数を確認します。アプリケーション サーバーが 10 台しかなく、各サーバーに 50 個のプロセスがあり、各プロセスに 1 つのデータベース接続がある場合、MySQL サーバーへの同時接続は 10 * 50 = 500 個のみです (アクティブな接続ではありません)。500 個の同時接続は MySQL では簡単なことです。問題 2 を解決するために、接続プールを使用する必要はありません。 アプリケーション サーバーが 1,000 台ある場合、接続プールが必要ですが、この接続プールはローカル アプリケーション サーバーで実行されている接続プールにすることはできません。1,000 台のアプリケーション サーバーには 1,000 個の接続プールがあるためです。各接続プールが 10 個の接続しか開かなくても、データベース接続の数はすぐにいっぱいになります。したがって、現在のサーバー上でいくつかのタスク プロセスを開いて接続プールを実装しても、この問題が解決するとは思わないでください。 1,000 台のアプリケーション サーバーのクラスターの場合、各サーバーに複数のプロセスを持つ接続プールを実装する方法も信頼性が低くなります。問題 2 の実際の解決策は、独立したデータベース接続プール サーバーまたはクラスターを確立して、すべてのデータベース接続をグローバルに管理することです。 要約すれば、 問題 1 のためだけに PHP の MySQL 接続プールを実装する場合、いわゆる接続プールよりもデータベース シングルトンの方がシンプルで効率的なアプローチです。 質問 2 を達成することが目的であれば、ビジネスはある程度の規模である必要があります。workerman を使用して個別の接続プール クラスターを実際に作成する場合は、次の方法が簡単です。いくつかのタスク プロセスを作成し、各プロセスでデータベース接続を作成し、タスク プロセスは SQL 要求を受信した後、それを MySQL サーバーに送信します。MySQL サーバーが戻った後、タスク プロセスは結果を SQL イニシエーターに送信します。 接続プールのコードは次のようになります。複数のサーバーで構成された接続プール クラスターの場合は、先頭に lvs を追加するのが最適です。 // テキスト プロトコルを使用するタスク ワーカー $task_worker = new Worker('Text://0.0.0.0:1234'); $task_worker->カウント = 64; $task_worker->名前 = 'MysqlTask'; $task_worker->onMessage = 関数($connection、$sql) { // SQL を実行します.... 結果を取得しますが、ここでは省略します.... $sql_result = your_mysql_query($sql); // 結果を送信します $connection->send(json_encode($sql_result)); }; 作業員を呼ぶ: \Workerman\Connection\AsyncTcpConnection を使用します。 // リモート接続プール サービスとの非同期接続を確立します。IP アドレスは、リモート接続プール サービスの IP アドレスです。クラスターの場合は、LVS サービスの IP アドレスです。 $sql_connection = 新しい AsyncTcpConnection('Text://ip:1234'); // SQL を送信 $sql_connection->send("SELECT ... FROM ....."); // 非同期でSQL結果を取得します $sql_connection->onMessage = function($sql_connection, $sql_result) { // ここでは結果を印刷するだけです var_dump(json_decode($task_result)); }; // 非同期接続を実行します $sql_connection->connect(); 以上が今回紹介したworkermanでのMySQLコネクションプールの書き方についてのノウハウです。補足事項がありましたら123WORDPRESS.COMの編集者までご連絡ください。 以下もご興味があるかもしれません:
|
<<: Springboot+Vue-Cropperでアバターの切り取りとアップロードの効果を実現
>>: Nginx リバース プロキシ springboot jar パッケージ プロセス分析
私が初めて Web 開発を独学で学んだ頃は、いわゆる DIV/CSS レイアウトはなく、テーブル レ...
変数の宣言グローバル変数の設定@a='新しい変数' を設定します。関数やストアドプロ...
<br />著者はかつてWebデザインの初心者でしたが、継続的な探求と実践を通じて、今で...
目次1: 単一マシンのパスワードフリーログイン構成1. 仮想マシンのホスト名を設定する2. 仮想マシ...
Centos7では、/etc/rc.d/rc.localファイルの権限が削減されており、実行権限があ...
目次目的モジュールのインストール基本的な使い方ポートをスキャンする開いているポートデータの送信データ...
目次要約する要約する配列が変更されると、対応するデータを動的にロードしますシナリオ: 異なるコンポー...
目次tf-gpu をダウンロード取得したtf-gpuイメージに基づいて独自のイメージを構築するイメー...
目次1. 関数の抽出2. 重複した条件付きスニペットを結合する3. 条件分岐文を関数に抽出する4. ...
プロジェクトの目的元のWindows環境でphpstudyを使用して構築されたMySQL 5.5.5...
MySQLサービスを停止するWindowsでは、マイコンピュータを右クリック--管理--サービスと...
実際のプロジェクトでは、上下のスクロール バーと左右のスクロール バーは DIV 内にないため、右の...
1. はじめにプロジェクトではMySQLを使用しています。インターネット上の例を参考にインストール...
この記事の例では、記事の折りたたみと展開の機能を実現するためのjQueryの具体的なコードを参考まで...
序文多くの MySQL テスト シナリオでは、テスト用に一部のテスト データを手動で生成する必要があ...