まず、接続プールが使用される理由と、接続プールがどのような問題を解決できるかを理解する必要があります。
接続プールの主な機能:
1. データ サーバーは TCP 接続の 3 ウェイ ハンドシェイクを確立し、4 回のハンドシェイクのオーバーヘッドを伴って接続を閉じることで、クライアントと mysql サーバーの負荷が軽減され、リクエストの応答時間が短縮されます
2. データベースへの同時接続数を減らすと、アプリケーション サーバーの過負荷の問題が解決されます。問題 1
を解決するには、Workerman のデータベース接続プールが最も効率的な方法ではなく、トラブルが発生します。 PHP は単一プロセスおよび単一スレッドであるため、PHP を使用してデータベース接続プールを実装するには、必ず別のプロセスが必要になります。これにはプロセス間通信が含まれ、mysql との直接通信の元のプロセスが接続プールとのプロセスになり、ここでも、MySQL 通信によりアプリケーション側の負荷が増加します。
問題 1 を解決する最も効率的な方法は、ビジネス プロセスごとにデータベースの単一インスタンス (Workerman が提供する DB クラスなど) を確立し、データベースへの長い接続を実装して、各ビジネス プロセスのすべてのリクエストが実行されるようにすることです。プロセスは独自のものを使用しますデータベースの長い接続の場合、プロセスのライフサイクル全体で TCP ハンドシェイクと切断ウェーブのオーバーヘッドは 1 つだけあり、アプリケーションは mysql と直接通信します接続プールのようなプロセス間 IPC 通信の中間層はありません、その中でも性能は最高です。質問 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,使用Text协议 $task_worker = new Worker('Text://0.0.0.0:1234'); $task_worker->count = 64; $task_worker->name = 'MysqlTask'; $task_worker->onMessage = function($connection, $sql) { // 执行sql.... 得到结果,这里省略.... $sql_result = your_mysql_query($sql); // 发送结果 $connection->send(json_encode($sql_result)); };
use \Workerman\Connection\AsyncTcpConnection; // 与远程连接池服务建立异步链接,ip为远程连接池服务的ip,如果是集群就是lvs的ip $sql_connection = new 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接続プールを記述する方法と機能の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。