Pool::__construct
(PHP 8.6+, True Async 1.0)
public Pool::__construct(
callable $factory,
?callable $destructor = null,
?callable $healthcheck = null,
?callable $beforeAcquire = null,
?callable $beforeRelease = null,
int $min = 0,
int $max = 10,
int $healthcheckInterval = 0
)
Створює новий пул ресурсів. Пул керує набором об’єктів багаторазового використання (з’єднання, клієнти, файлові дескриптори тощо), автоматично створюючи та знищуючи їх за потребою.
Параметри
- factory
- Фабрична функція для створення нового ресурсу. Викликається кожного разу, коли пулу потрібен новий ресурс і поточна кількість менша за
max. Повинна повертати готовий до використання ресурс. - destructor
- Функція для коректного знищення ресурсу. Викликається при закритті пулу або при видаленні ресурсу (наприклад, після невдалої перевірки стану).
null— ресурс просто видаляється з пулу без додаткових дій. - healthcheck
- Функція перевірки стану ресурсу. Приймає ресурс, повертає
bool.true— ресурс справний,false— ресурс буде знищено та замінено.null— перевірка стану не виконується. - beforeAcquire
- Хук, що викликається перед видачею ресурсу. Приймає ресурс. Може використовуватися для підготовки ресурсу (наприклад, скидання стану).
null— без хука. - beforeRelease
- Хук, що викликається перед поверненням ресурсу до пулу. Приймає ресурс, повертає
bool. Якщо повертаєfalse, ресурс знищується замість повернення до пулу.null— без хука. - min
- Мінімальна кількість ресурсів у пулі. При створенні пулу негайно створюється
minресурсів. За замовчуванням0. - max
- Максимальна кількість ресурсів у пулі. При досягненні ліміту виклики
acquire()блокуються до звільнення ресурсу. За замовчуванням10. - healthcheckInterval
- Інтервал фонової перевірки стану ресурсів у мілісекундах.
0— фонова перевірка вимкнена (перевірка лише при отриманні).
Приклади
Приклад #1 Пул з’єднань PDO
<?php
use Async\Pool;
$pool = new Pool(
factory: function(): PDO {
return new PDO('mysql:host=localhost;dbname=app', 'user', 'pass', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
},
destructor: function(PDO $pdo): void {
// PDO is closed automatically when removed
},
healthcheck: function(PDO $pdo): bool {
try {
$pdo->query('SELECT 1');
return true;
} catch (\Throwable) {
return false;
}
},
min: 2,
max: 20,
healthcheckInterval: 30000 // check every 30 seconds
);
$conn = $pool->acquire();
$result = $conn->query('SELECT * FROM users');
$pool->release($conn);
Приклад #2 Пул з хуками
<?php
use Async\Pool;
$pool = new Pool(
factory: fn() => new RedisClient('127.0.0.1', 6379),
destructor: fn(RedisClient $r) => $r->close(),
beforeAcquire: function(RedisClient $r): void {
$r->select(0); // reset to default database
},
beforeRelease: function(RedisClient $r): bool {
// If the connection is broken — destroy the resource
return $r->isConnected();
},
max: 5
);
Дивіться також
- Pool::acquire — Отримати ресурс з пулу
- Pool::release — Повернути ресурс до пулу
- Pool::close — Закрити пул