3 корутины, 2 соединения в пуле — автоматическое управление через $stmt и транзакции

Код — один 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
готова
Timeline выполнения 0 ms
Корутина 1
Корутина 2
Корутина 3
015304555ms
CPU работает
Ожидание БД
Ожидание пула
0 ms
Общее время
0 ms
Ожидание БД
0 ms
Ожидание пула
0 ms
Сэкономлено

Нажмите "Запустить" для начала

Визуализация показывает, как пул соединений PDO автоматически управляет ресурсами. Соединение удерживается, пока жив $stmt или активна транзакция. Когда $stmt уничтожается и транзакции нет — соединение автоматически возвращается в пул.