Rumah  >  Artikel  >  rangka kerja php  >  Bagaimanakah semua coroutine Swoole berkongsi sambungan pangkalan data yang sama?

Bagaimanakah semua coroutine Swoole berkongsi sambungan pangkalan data yang sama?

WBOY
WBOYasal
2023-06-25 11:00:411190semak imbas

Dengan perkembangan pesat Internet dan pertumbuhan volum data yang berterusan, untuk memastikan prestasi tinggi dan kebolehskalaan aplikasi, pembangun telah mula menggunakan secara meluas rangka kerja pengaturcaraan tak segerak. Sejak dilancarkan, Swoole telah menjadi perintis dalam pengaturcaraan tak segerak PHP dan telah digemari oleh semakin ramai pembangun. Swoole menyediakan sokongan coroutine penuh, yang boleh meningkatkan keupayaan pemprosesan permintaan serentak aplikasi. Dalam sesetengah senario aplikasi, coroutine yang berbeza perlu berkongsi sambungan pangkalan data yang sama Dalam kes ini, teknologi perkongsian coroutine Swoole perlu digunakan.

Intipati teknologi perkongsian coroutine Swoole adalah untuk memperuntukkan sambungan pangkalan data dalam kumpulan sambungan kepada coroutine untuk digunakan Selepas coroutine digunakan, sambungan dikembalikan ke kumpulan sambungan. Kelebihan ini ialah ia mengelakkan setiap coroutine perlu menyambung ke pangkalan data, dengan itu mengurangkan overhed sambungan dan meningkatkan prestasi aplikasi. Dalam persekitaran berbilang coroutine, perkongsian sambungan pangkalan data dalam kumpulan sambungan yang sama juga boleh mengelak daripada dihadkan oleh bilangan sambungan.

Mari kita lihat cara Swoole melaksanakan coroutine untuk berkongsi sambungan pangkalan data yang sama.

Langkah 1: Pasang sambungan Swoole

Tapak web rasmi Swoole menyediakan tutorial pemasangan Ia hanya mengambil beberapa langkah mudah untuk menyelesaikan pemasangan. Selepas pemasangan selesai, anda perlu menambah konfigurasi sambungan swoole dalam fail php.ini:

extension=swoole.so

Langkah 2: Buat kolam sambungan

Dalam Swoole, kolam sambungan adalah konsep yang sangat penting, dan fungsinya adalah untuk meningkatkan sambungan pangkalan data Kebolehgunaan semula. Kumpulan sambungan akan mengekalkan kegigihan sambungan untuk mengelakkan sambungan kerap ke pangkalan data dan memastikan kecekapan aplikasi. Kita boleh menggunakan kelas kumpulan sambungan Swoole SwooleCoroutineMySQLPool untuk mencipta objek kumpulan sambungan. 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

Penerangan item konfigurasi kolam sambungan:

  • hos: alamat hos sambungan pangkalan data
  • port: nombor port sambungan pangkalan data
  • pengguna : pengguna nama sambungan pangkalan data
  • kata laluan: kata laluan untuk sambungan pangkalan data
  • pangkalan data: nama pangkalan data lalai
  • set aksara: pengekodan digunakan untuk sambungan
  • masa tamat: Sambungan masa tamat
  • strict_type: Sama ada hendak mendayakan mod ketat
  • fetch_mode: Sama ada hendak menggunakan kaedah pemerolehan data tersuai
  • max_idle_time: Masa melahu maksimum sambungan
  • max_object_num: Bilangan maksimum sambungan dalam kumpulan sambungan
Langkah 3: Dapatkan objek sambungan

Selepas mencipta kumpulan sambungan, anda perlu mendapatkan pangkalan data objek sambungan dalam setiap coroutine. Dalam Swoole, anda boleh mendapatkan objek sambungan pangkalan data melalui kaedah SwooleCoroutineMySQLPool->get(). 🎜rrreee🎜Nota: Setiap coroutine mesti mendapatkan objek sambungan melalui kumpulan sambungan untuk mengelakkan berbilang coroutine mengendalikan objek sambungan yang sama pada masa yang sama. 🎜🎜Langkah 4: Tutup sambungan🎜🎜Selepas coroutine telah menggunakan objek sambungan, ia harus mengembalikannya ke kolam sambungan. Dalam Swoole, sambungan boleh dikembalikan ke kolam sambungan melalui SwooleCoroutineMySQLPool->put(). 🎜rrreee🎜Langkah 5: Laksanakan coroutine yang berkongsi kumpulan sambungan yang sama🎜🎜Dalam senario aplikasi sebenar, biasanya diperlukan untuk melaksanakan keperluan untuk coroutine berkongsi kumpulan sambungan yang sama. Pada masa ini, kita boleh mencapainya melalui suntikan pergantungan. 🎜rrreee🎜Mendaftarkan contoh kumpulan sambungan ke bekas dalam kod dan menggunakan kaedah singleton() untuk menetapkannya sebagai objek tunggal untuk memastikan berbilang coroutine berkongsi tika kumpulan sambungan yang sama. 🎜🎜Yang berikut menunjukkan cara menggunakan kumpulan sambungan dalam coroutine: 🎜rrreee🎜Melalui kaedah make(), anda boleh mendapatkan contoh perpustakaan bergantung dalam coroutine, supaya berbilang coroutine boleh berkongsi sambungan pangkalan data yang sama. 🎜🎜Ringkasan🎜🎜Teknologi perkongsian coroutine Swoole boleh mengelakkan sambungan pangkalan data yang kerap dan meningkatkan prestasi dan kebolehskalaan aplikasi. Apabila menyedari bahawa coroutine berkongsi kumpulan sambungan yang sama, kami boleh mencapainya melalui suntikan pergantungan, untuk mencapai tujuan berbilang coroutine berkongsi sambungan pangkalan data yang sama. Lain kali anda perlu menggunakan teknologi coroutine Swoole semasa membangunkan aplikasi, anda juga boleh mencuba teknologi perkongsian coroutine untuk meningkatkan kecekapan aplikasi. 🎜

Atas ialah kandungan terperinci Bagaimanakah semua coroutine Swoole berkongsi sambungan pangkalan data yang sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn