Код — один PDO з пулом, 3 корутини
// Один PDO-об'єкт з пулом на 2 з'єднання
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_POOL_ENABLED => true,
PDO::ATTR_POOL_MAX => 2,
]);
for ($i = 1; $i <= 3; $i++) {
spawn(function() use ($pdo, $i) {
// prepare() автоматично бере conn з пулу
$stmt = $pdo->prepare("SELECT * FROM users WHERE id=?");
$stmt->execute([$i]); // очікування відповіді БД
$user = $stmt->fetch();
processUser($user);
// $stmt виходить зі scope -> refcount=0
// conn автоматично повертається в пул!
});
}
PDO Pool (ATTR_POOL_MAX: 2)
З'єднання #1
вільне
З'єднання #2
вільне
Черга очікування:
порожня
Корутина 1
готова
Корутина 2
готова
Корутина 3
готова