diego-ninja/swoole-mysql-doctrine-driver

Swoole Coroutine Mysql 扩展之上的 Doctrine DBAL Driver 实现

dev-main 2022-02-14 08:57 UTC

This package is auto-updated.

Last update: 2024-09-14 14:46:43 UTC


README

基于 Swoole\Coroutine\MySQLDoctrine\DBAL\Driver 实现。

入门指南

安装

composer require diego-ninja/swoole-mysql-doctrine-driver

使用

Doctrine 参数,对于 DBAL 和 ORM 项目都接受 driverClass 选项;这就是我们可以注入此项目驱动的地方

use Doctrine\DBAL\{Driver, DriverManager};

$params = [
    'dbname' => 'mysql',
    'user' => 'mysql',
    'password' => 'mysql',
    'host' => 'db',
    'driverClass' => Driver\Swoole\Coroutine\Mysql\Driver::class,
    'poolSize' => 8,
];

$conn = DriverManager::getConnection($params);

是的,我故意使用了 Doctrine\DBAL\Driver 命名空间 + Swoole\Coroutine\MySQL 命名空间,所以它不会混淆。

你可以在协程(纤程)内部尽情使用它

Co\run(static function() use ($conn): void {
    $results = [];
    $wg = new Co\WaitGroup();
    $start_time = time();

    Co::create(static function() use (&$results, $wg, $conn): void {
        $wg->add();
        $results[] = $conn->executeQuery('select 1, sleep(1)')->fetchOne();
        $wg->done();
    });

    Co::create(static function() use (&$results, $wg, $conn): void {
        $wg->add();
        $results[] = $conn->executeQuery('select 1, sleep(1)')->fetchOne();
        $wg->done();
    });

    $wg->wait();
    $elapsed = time() - $start_time;
    $sum = array_sum($results);

    echo "Two sleep(1) queries in $elapsed second, returning: $sum\n";
});

你应该会看到 一秒内的两个 sleep(1) 查询,返回:2,而总时间应该是 是 2(sleep(1) 的总和),因为它们是并发运行的。

real    0m1.228s
user    0m0.036s
sys     0m0.027s