Workermanはmysql接続プールのサンプルコードを書きます

Workermanはmysql接続プールのサンプルコードを書きます

まず、接続プールを使用する理由と、接続プールによってどのような問題が解決できるかを理解する必要があります。

接続プールの主な機能は次のとおりです。

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の編集者までご連絡ください。

以下もご興味があるかもしれません:
  • Spring Boot Mysql バージョン駆動型接続プールソリューションの選択の詳細な説明
  • PythonはPyMysqlとDBUtilsを使用して接続プールを作成し、パフォーマンスを向上させます。
  • Node.js で MySQL 接続プールを使用する例
  • Node.js が接続プールに基づいて MySQL に接続するメソッドを実装する方法の例
  • Node.js を使用してトランザクションを使用して MySQL 接続プール内の接続を自動的にリサイクルする方法の例
  • PHP は MySQL 接続プール効果の実装コードを実現します
  • Python MySQL データベース接続プールコンポーネント pymysqlpool の詳細な説明
  • Java は MySQL を使用して接続プールを実装するコード例

<<:  Springboot+Vue-Cropperでアバターの切り取りとアップロードの効果を実現

>>:  Nginx リバース プロキシ springboot jar パッケージ プロセス分析

推薦する

HTML テーブルの空白セル補完を実装する方法

私が初めて Web 開発を独学で学んだ頃は、いわゆる DIV/CSS レイアウトはなく、テーブル レ...

MySQL 変数宣言とストアド プロシージャの分析

変数の宣言グローバル変数の設定@a='新しい変数' を設定します。関数やストアドプロ...

ウェブデザイン経験

<br />著者はかつてWebデザインの初心者でしたが、継続的な探求と実践を通じて、今で...

パスワードログインなしのLinux構成スタンドアロンおよびフルディストリビューションの詳細なチュートリアル

目次1: 単一マシンのパスワードフリーログイン構成1. 仮想マシンのホスト名を設定する2. 仮想マシ...

Centos7.3は起動時に自動的に起動または指定されたコマンドを実行します

Centos7では、/etc/rc.d/rc.localファイルの権限が削減されており、実行権限があ...

Node.js での SerialPort モジュールの使用

目次目的モジュールのインストール基本的な使い方ポートをスキャンする開いているポートデータの送信データ...

Vueコンポーネントの動的コンポーネントの詳細な説明

目次要約する要約する配列が変更されると、対応するデータを動的にロードしますシナリオ: 異なるコンポー...

DockerでGPUを使用するプロセスの詳細な説明

目次tf-gpu をダウンロード取得したtf-gpuイメージに基づいて独自のイメージを構築するイメー...

11 の素晴らしい JavaScript コード リファクタリングのベスト プラクティスの概要

目次1. 関数の抽出2. 重複した条件付きスニペットを結合する3. 条件分岐文を関数に抽出する4. ...

phpstudy から Linux への MySQL の移行に関するチュートリアル

プロジェクトの目的元のWindows環境でphpstudyを使用して構築されたMySQL 5.5.5...

MySQL ルートパスワードエラー番号 1045 の解決方法

MySQLサービスを停止するWindowsでは、マイコンピュータを右クリック--管理--サービスと...

カスタムスクロールバー効果を実現するJavaScript

実際のプロジェクトでは、上下のスクロール バーと左右のスクロール バーは DIV 内にないため、右の...

MySQL 8.0.12 のインストールと設定方法のグラフィックチュートリアル (Windows 版)

1. はじめにプロジェクトではMySQLを使用しています。インターネット上の例を参考にインストール...

jQueryは記事の折りたたみと展開の機能を実装します

この記事の例では、記事の折りたたみと展開の機能を実現するためのjQueryの具体的なコードを参考まで...

MySQL で重複しない携帯電話番号テーブルをバッチ生成する方法のサンプルコード

序文多くの MySQL テスト シナリオでは、テスト用に一部のテスト データを手動で生成する必要があ...