scrawler/swoole-postgresql-doctrine

基于 Swoole 协程 PostgreSQL 扩展的 Doctrine DBAL 驱动实现

1.1.1 2021-11-07 21:09 UTC

README

Swoole\Coroutine\PostgreSQL 上实现的 Doctrine\DBAL\Driver。需要 ext-openswoole 4.7.1 或更高版本

入门

安装

composer require scrawler/swoole-postgresql-doctrine

用法

Doctrine 参数,对于 DBAL 和 ORM 项目,都接受 driverClass 选项;我们可以在那里注入此项目的驱动

use Doctrine\DBAL\{Driver, DriverManager};

$params = [
    'dbname' => 'postgres',
    'user' => 'postgres',
    'password' => 'postgres',
    'host' => 'db',
    'driverClass' =>\Scrawler\Swoole\PostgreSQL\Driver::class,
    'poolSize' => 8,
];

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

您现在可以在协程(纤程)内大显身手了

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, pg_sleep(1)')->fetchOne();
        $wg->done();
    });

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

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

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

您应该看到 1 秒内执行两个 pg_sleep(1) 查询,返回:2,而总时间不应该 2(pg_sleep(1) 的总和),因为它们是并发执行的。

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

致谢

本项目得以实现得益于 https://github.com/leocavalcante/swoole-postgresql-doctrine-driver

所有改进都已添加到原始仓库,请查看此 PR https://github.com/leocavalcante/swoole-postgresql-doctrine-driver/pull/2