3 coroutine, 2 connessioni in pool — gestione automatica tramite $stmt e transazioni

Codice — un PDO con pool, 3 coroutine
// Un singolo oggetto PDO con un pool di 2 connessioni
$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() acquisisce automaticamente una conn dal pool
$stmt = $pdo->prepare("SELECT * FROM users WHERE id=?");
$stmt->execute([$i]); // attende il DB
$user = $stmt->fetch();
processUser($user);
// $stmt esce dallo scope -> refcount=0
// la conn torna automaticamente al pool!
});
}
PDO Pool (ATTR_POOL_MAX: 2)
🔌
Connessione #1
disponibile
🔌
Connessione #2
disponibile
Coda di attesa:
vuota
Coroutine 1
pronta
Coroutine 2
pronta
Coroutine 3
pronta
Timeline di esecuzione 0 ms
Coroutine 1
Coroutine 2
Coroutine 3
015304555ms
CPU attiva
Attesa DB
Attesa pool
0 ms
Tempo totale
0 ms
Attesa DB
0 ms
Attesa pool
0 ms
Tempo risparmiato

Clicca su "Avvia" per iniziare

Questa visualizzazione mostra come il pool di connessioni PDO gestisce automaticamente le risorse. Una connessione viene bloccata finché esiste $stmt o una transazione è attiva. Quando $stmt viene distrutto e non c'è una transazione attiva, la connessione torna automaticamente al pool.