Heim  >  Artikel  >  PHP-Framework  >  Wie nutzen alle Swoole-Coroutinen dieselbe Datenbankverbindung?

Wie nutzen alle Swoole-Coroutinen dieselbe Datenbankverbindung?

WBOY
WBOYOriginal
2023-06-25 11:00:411159Durchsuche

Mit der rasanten Entwicklung des Internets und dem kontinuierlichen Wachstum des Datenvolumens haben Entwickler begonnen, asynchrone Programmier-Frameworks in großem Umfang zu verwenden, um die hohe Leistung und Skalierbarkeit von Anwendungen sicherzustellen. Seit seiner Einführung hat sich Swoole zu einem Pionier der asynchronen PHP-Programmierung entwickelt und wird von immer mehr Entwicklern bevorzugt. Swoole bietet vollständige Coroutine-Unterstützung, wodurch die gleichzeitigen Verarbeitungsfunktionen der Anwendung erheblich verbessert werden können. In einigen Anwendungsszenarien müssen verschiedene Coroutinen dieselbe Datenbankverbindung teilen. In diesem Fall muss die Swoole-Coroutine-Sharing-Technologie verwendet werden.

Der Kern der Swoole-Coroutine-Sharing-Technologie besteht darin, der Coroutine Datenbankverbindungen im Verbindungspool zur Verwendung zuzuweisen. Nachdem die Coroutine verwendet wurde, wird die Verbindung an den Verbindungspool zurückgegeben. Dies hat den Vorteil, dass vermieden werden kann, dass jede Coroutine eine Verbindung zur Datenbank herstellen muss, wodurch der Verbindungsaufwand reduziert und die Anwendungsleistung verbessert wird. In einer Umgebung mit mehreren Coroutinen kann durch die gemeinsame Nutzung von Datenbankverbindungen im selben Verbindungspool auch eine Einschränkung durch die Anzahl der Verbindungen vermieden werden.

Werfen wir einen Blick darauf, wie Swoole Coroutinen implementiert, um dieselbe Datenbankverbindung zu teilen.

Schritt 1: Installieren Sie die Swoole-Erweiterung

Die offizielle Website von Swoole bietet ein Installations-Tutorial. Es sind nur ein paar einfache Schritte erforderlich, um die Installation abzuschließen. Nachdem die Installation abgeschlossen ist, müssen Sie die Swoole-Erweiterungskonfiguration in der php.ini-Datei hinzufügen:

extension=swoole.so

Schritt 2: Erstellen Sie einen Verbindungspool

In Swoole ist der Verbindungspool ein sehr wichtiges Konzept und seine Funktion besteht darin Erhöhen Sie die Wiederverwendbarkeit von Datenbankverbindungen. Der Verbindungspool behält die Persistenz der Verbindung bei, um häufige Verbindungen zur Datenbank zu vermeiden und die Effizienz der Anwendung sicherzustellen. Wir können die Verbindungspoolklasse SwooleCoroutineMySQLPool von Swoole verwenden, um ein Verbindungspoolobjekt zu erstellen. 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:是否开启严格模式
  • fetch_mode:是否使用自定义数据获取方式
  • max_idle_time:连接最大空闲时间
  • max_object_num:连接池中最多存在的连接数

第三步:获取连接对象

创建连接池后,需要在每个协程中获取数据库连接对象。在Swoole中,可以通过 SwooleCoroutineMySQLPool->get() 方法获取数据库连接对象。

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

注意:每个协程都要通过连接池获取连接对象,避免多个协程同时操作同一个连接对象。

第四步:关闭连接

协程使用完连接对象后,应该将其归还给连接池。在Swoole中,可以通过 SwooleCoroutineMySQLPool->put() 将连接归还给连接池。

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

第五步:实现协程共享同一连接池

在实际的应用场景中,通常需要实现协程共享同一连接池的需求。这时候,我们可以通过依赖注入的方式来实现。

<?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()rrreee

Beschreibung der Verbindungspool-Konfigurationselemente:

  • Host: die Hostadresse der Datenbankverbindung
  • Port: die Portnummer der Datenbankverbindung
  • Benutzer : der Benutzer des Datenbankverbindungsnamens
  • Passwort: Passwort für die Datenbankverbindung
  • Datenbank: Standarddatenbankname
  • Zeichensatz: für die Verbindung verwendete Kodierung
  • timeout: Verbindungszeitlimit
  • strict_type: Ob der strikte Modus aktiviert werden soll
  • fetch_mode: Ob eine benutzerdefinierte Datenerfassungsmethode verwendet werden soll
  • max_idle_time: Maximale Leerlaufzeit von die Verbindung
  • max_object_num: Die maximale Anzahl von Verbindungen im Verbindungspool
Schritt 3: Erhalten Sie das Verbindungsobjekt

Nach dem Erstellen des Verbindungspools müssen Sie die Datenbank abrufen Verbindungsobjekt in jeder Coroutine. In Swoole können Sie das Datenbankverbindungsobjekt über die Methode SwooleCoroutineMySQLPool->get() abrufen. 🎜rrreee🎜Hinweis: Jede Coroutine muss das Verbindungsobjekt über den Verbindungspool erhalten, um zu vermeiden, dass mehrere Coroutinen gleichzeitig dasselbe Verbindungsobjekt ausführen. 🎜🎜Schritt 4: Verbindung schließen🎜🎜Nachdem die Coroutine das Verbindungsobjekt verwendet hat, sollte sie es an den Verbindungspool zurückgeben. In Swoole kann die Verbindung über SwooleCoroutineMySQLPool->put() an den Verbindungspool zurückgegeben werden. 🎜rrreee🎜Schritt 5: Coroutinen implementieren, die denselben Verbindungspool gemeinsam nutzen🎜🎜In tatsächlichen Anwendungsszenarien ist es normalerweise erforderlich, die Anforderung zu implementieren, dass Coroutinen denselben Verbindungspool gemeinsam nutzen. Zu diesem Zeitpunkt können wir dies durch Abhängigkeitsinjektion erreichen. 🎜rrreee🎜Registrierte die Verbindungspool-Instanz im Container im Code und legte sie mit der Methode singleton() als Singleton-Objekt fest, um sicherzustellen, dass mehrere Coroutinen dieselbe Verbindungspool-Instanz gemeinsam nutzen. 🎜🎜Im Folgenden wird gezeigt, wie der Verbindungspool in der Coroutine verwendet wird: 🎜rrreee🎜Über die Methode make() können Sie die abhängige Bibliotheksinstanz in der Coroutine abrufen, sodass mehrere Coroutinen diese gemeinsam nutzen können gleiche Datenbankverbindung. 🎜🎜Zusammenfassung🎜🎜Swooles Coroutine-Sharing-Technologie kann häufige Datenbankverbindungen vermeiden und die Anwendungsleistung und Skalierbarkeit verbessern. Wenn wir erkennen, dass Coroutinen denselben Verbindungspool teilen, können wir dies durch Abhängigkeitsinjektion erreichen, um den Zweck zu erreichen, dass mehrere Coroutinen dieselbe Datenbankverbindung teilen. Wenn Sie das nächste Mal bei der Entwicklung einer Anwendung die Coroutine-Technologie von Swoole verwenden müssen, können Sie auch die Coroutine-Sharing-Technologie ausprobieren, um die Effizienz der Anwendung zu verbessern. 🎜

Das obige ist der detaillierte Inhalt vonWie nutzen alle Swoole-Coroutinen dieselbe Datenbankverbindung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn