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 パッケージ プロセス分析

推薦する

Linux で複数のファイルの名前を一括で変更する方法

Linux では、通常、ファイルの名前を変更するために mv コマンドを使用します。これは、単一のフ...

MySQLトランザクションとSpring分離レベルの実装原理の詳細な説明

1. トランザクションはACID特性を持つ原子性: トランザクションは、トランザクションによって分割...

Vueライフサイクルの詳細な説明

目次ライフサイクルを理解する理由ライフサイクルとはライフサイクルフック関数作成され、マウントされたフ...

CentOS のクローン作成、Linux 仮想マシンの共有の完全な手順

序文Linux が完全にセットアップされると、クローン機能を使用して短時間で複数の Linux を作...

Dockerはコンテナポートバインディングのローカルポートを実装します

今日、イメージを起動した後、HTTP リクエスト経由でアクセスできないという小さな問題が発生しました...

better-scrollプラグインのスライドできないバグについて(2021年プラグインで解決)

より良いスクロールの原則親コンテナーであるため、ラッパーの高さはコンテンツのサイズに応じて増加します...

バックエンドから返される 100,000 個のデータをフロントエンドでより適切に表示するにはどうすればよいですか?

目次予備作業バックエンド構築フロントエンドページダイレクトレンダリングsetTimeout ページン...

MySQL SQL文を最適化するためのヒント

十分に最適化されていない、またはパフォーマンスが極端に低い SQL ステートメントに直面した場合、通...

JavaScript におけるセミコロンの詳細

序文JavaScript ではセミコロンはオプションであり、使用するかどうかは主にコーディング スタ...

JSパッケージオブジェクトに関する簡単な説明

目次概要意味インスタンスメソッドプリミティブ型とインスタンスオブジェクト間の自動変換カスタムメソッド...

Linux の操作とメンテナンスの基本 httpd 静的 Web ページ チュートリアル

目次1. ウェアハウスを使用してhttpd lrzsz解凍ファイルを作成する2. ソースコードファイ...

vue-router を遅延ロードする 3 つの方法のまとめ

遅延読み込みを使用しない 'vue' から Vue をインポートします。 '...

js キャンバスは角丸画像を実現します

この記事では、角を丸くするためのjsキャンバスの具体的なコードを参考までに紹介します。具体的な内容は...

Zabbix を使用して Nginx/Tomcat/MySQL を監視する方法の詳細なチュートリアル

目次ZabbixはNginxを監視するZabbixはTomcatを監視するZabbixはMySQLを...