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

推薦する

ReactはExcelファイルのインポートとエクスポートを実装します

目次プレゼンテーション層ビジネスレイヤーコアプラグイン xlsx ExcelインポートExcelエク...

VMware15 の Deepin インストール詳細チュートリアル (画像とテキスト)

序文Deepin のユーザー インターフェイスは、使用時に非常に見栄えがします。インターフェイス効果...

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

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

CSS3 box-shadow プロパティの詳細な例

CSS3 - 影の追加(ボックスシャドウの使用) CSS3 - div またはテキストに影を追加する...

Angularフレームワークのビュー抽象定義の詳細な説明

序文「大規模なフロントエンド プロジェクト向け」に設計されたフロントエンド フレームワークである A...

docker pullがリセットされる問題を解決する

この記事では、docker pull がリセットされる問題を解決する方法を紹介し、皆さんと共有します...

ワンクリックで雨や雪のエフェクトを実現する ThingJS パーティクルエフェクト

目次1. パーティクルエフェクト2. シーンを読み込む3. さまざまな粒子効果の実現エンディング: ...

MySQLの関連ロックについての簡単な理解

この記事は主にInnoDBのロックに関する知識を素早く理解してもらうことを目的としています。 Roc...

MacOS での MySQL 8.0.18 のインストールと設定方法のグラフィック チュートリアル

この記事では、MacOSでのMySQL 8.0.18のインストールと成功したコマンドライン操作を記録...

Windows 10 での MySQL 8.0.20 のインストールと設定方法のグラフィック チュートリアル

Win10システムにMySQL8.0.20をローカルにインストールし、個人的にテストして利用可能であ...

Docker tomcatのメモリサイズを設定する方法

Docker に Tomcat をインストールする場合、大きなファイルをダウンロードするときなど、場...

CSS3 マウスホバー遷移ズーム効果

以下は、純粋な CSS で記述された画像マウスホバーズーム効果です。実際、基本原理は非常に単純です。...

CSS スタイルの優先順位はどれくらい複雑ですか?

昨晩、面接の質問を見ていたら、CSS スタイルの優先順位について特に明確に説明していない人が何人かい...

MySQL マスタースレーブレプリケーションの遅延の原因と解決策

目次レプリケーション ロジックの簡単な概要:遅延の原因と解決策〇メインデータベースへの頻繁なDMLリ...

HTML ページ スタイルの !-- -- の機能は何ですか?

主に低バージョンのブラウザ向け<!-- --> は HTML コメント タグです。上位バ...