ホームページ  >  記事  >  PHPフレームワーク  >  すべての Swoole コルーチンはどのようにして同じデータベース接続を共有するのでしょうか?

すべての Swoole コルーチンはどのようにして同じデータベース接続を共有するのでしょうか?

WBOY
WBOYオリジナル
2023-06-25 11:00:411158ブラウズ

インターネットの急速な発展とデータ量の継続的な増加に伴い、アプリケーションの高いパフォーマンスとスケーラビリティを確保するために、開発者は非同期プログラミング フレームワークを広く使用し始めています。 Swoole は発売以来、PHP 非同期プログラミングのパイオニアとなり、ますます多くの開発者に支持されています。 Swoole は完全なコルーチン サポートを提供し、アプリケーションの同時リクエスト処理能力を大幅に向上させることができます。一部のアプリケーション シナリオでは、異なるコルーチンが同じデータベース接続を共有する必要がある場合、Swoole コルーチン共有テクノロジを使用する必要があります。

Swoole コルーチン共有技術の本質は、接続プール内のデータベース接続をコルーチンに割り当てて使用し、コルーチンの使用後に接続を接続プールに戻すことです。この利点は、各コルーチンがデータベースに接続する必要がなくなり、接続のオーバーヘッドが削減され、アプリケーションのパフォーマンスが向上することです。マルチコルーチン環境では、同じ接続プール内のデータベース接続を共有することで、接続数による制限を回避することもできます。

Swoole が同じデータベース接続を共有するためにコルーチンを実装する方法を見てみましょう。

ステップ 1: Swoole Extension のインストール

Swoole の公式 Web サイトでインストール チュートリアルが提供されており、いくつかの簡単な手順を実行するだけでインストールが完了します。インストールが完了したら、php.ini ファイルに swoole 拡張構成を追加する必要があります。

extension=swoole.so

ステップ 2: 接続プールを作成する

Swoole では、接続プールは非常に便利です。重要な概念であり、その機能はデータベース接続の再利用性を高めることです。接続プールは接続の永続性を維持して、データベースへの頻繁な接続を回避し、アプリケーションの効率を確保します。 Swoole の接続プール クラス SwooleCoroutineMySQLPool を使用して、接続プール オブジェクトを作成できます。

<?php
$dbconfig = [
    'host' => '127.0.0.1',
    'port' => 3306,
    'user' => 'root',
    'password' => '',
    'database' => 'test_db',
    'charset' => 'utf8mb4',
    'timeout' => 30,
    'strict_type' => true,
    'fetch_mode' => true,
    'max_idle_time' => 3,
    'max_object_num' => 20,
];

$pool = new SwooleCoroutineMySQLPool($dbconfig);

接続プール設定項目の説明:

  • host: データベース接続のホスト アドレス
  • port: データベース接続のポート番号
  • user: データベース接続のユーザー名
  • password: データベース接続のパスワード
  • database: デフォルトで使用されるデータベース名
  • charset: 接続に使用されるエンコーディング
  • timeout: 接続タイムアウト期間
  • strict_type: strict モードを有効にするかどうか
  • fetch_mode: カスタム データ取得メソッドを使用するかどうか
  • max_idle_time: 接続の最大アイドル時間
  • max_object_num: 接続プールに存在する接続の最大数

ステップ 3: 接続オブジェクトを取得する

接続プールを作成した後、各コルーチンのデータベース接続オブジェクト。 Swoole では、SwooleCoroutineMySQLPool->get() メソッドを通じてデータベース接続オブジェクトを取得できます。

<?php
go(function () use ($pool) {
    // 获取连接对象
    $conn = $pool->get();
    // 查询操作
    $result = $conn->query('SELECT * FROM users');
    // 归还连接
    $pool->put($conn);
});

注: 複数のコルーチンが同じ接続オブジェクトを同時に操作しないように、各コルーチンは接続プールを通じて接続オブジェクトを取得する必要があります。

ステップ 4: 接続を閉じる

コルーチンが接続オブジェクトの使用を終了したら、接続オブジェクトを接続プールに返す必要があります。 Swoole では、SwooleCoroutineMySQLPool->put() を通じて接続を接続プールに返すことができます。

<?php
go(function () use ($pool) {
    $conn = $pool->get();
    $result = $conn->query('SELECT * FROM users');
    $pool->put($conn);
});

ステップ 5: 同じ接続プールを共有するコルーチンを実装する

実際のアプリケーション シナリオでは、通常、コルーチンが同じ接続プールを共有するという要件を実装する必要があります。現時点では、依存関係の注入を通じてこれを実現できます。

<?php
// 创建连接池
$dbconfig = [
    'host' => '127.0.0.1',
    'port' => 3306,
    'user' => 'root',
    'password' => '',
    'database' => 'test_db',
    'charset' => 'utf8mb4',
    'timeout' => 30,
    'strict_type' => true,
    'fetch_mode' => true,
    'max_idle_time' => 3,
    'max_object_num' => 20,
];

$pool = new SwooleCoroutineMySQLPool($dbconfig);

// 注册依赖库
$container = new Container();
$container->singleton(Pool::class, function () use ($pool) {
    return $pool;
});

コード内で接続プール インスタンスをコンテナに登録し、singleton() メソッドを使用してそれをシングルトン オブジェクトとして設定し、複数のコルーチンが同じ接続プール インスタンスを共有するようにしました。 。

以下は、コルーチンで接続プールを使用する方法を示しています。

<?php

// 协程1
go(function () use ($container) {
    $pool = $container->make(Pool::class);
    $conn = $pool->get();
    $result = $conn->query('SELECT * FROM users');
    $pool->put($conn);
});

// 协程2
go(function () use ($container) {
    $pool = $container->make(Pool::class);
    $conn = $pool->get();
    $result = $conn->query('SELECT * FROM users');
    $pool->put($conn);
});

make() メソッドを通じて、コルーチンで依存ライブラリ インスタンスを取得して、目的を達成できます。複数のコルーチンプロセスは同じデータベース接続を共有します。

概要

Swoole のコルーチン共有テクノロジは、頻繁なデータベース接続を回避し、アプリケーションのパフォーマンスとスケーラビリティを向上させることができます。コルーチンが同じ接続プールを共有していることを認識する場合、依存関係注入を通じてそれを実現し、複数のコルーチンが同じデータベース接続を共有するという目的を達成できます。次回、アプリケーションの開発時に Swoole のコルーチン テクノロジを使用する必要がある場合は、アプリケーションの効率を向上させるためにコルーチン共有テクノロジを試してみるとよいでしょう。

以上がすべての Swoole コルーチンはどのようにして同じデータベース接続を共有するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。