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 знищується і транзакції немає — з'єднання автоматично повертається до пулу.