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 закрывается автоматически при удалении
},
healthcheck: function(PDO $pdo): bool {
try {
$pdo->query('SELECT 1');
return true;
} catch (\Throwable) {
return false;
}
},
min: 2,
max: 20,
healthcheckInterval: 30000 // проверка каждые 30 секунд
);
$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); // сброс на базу по умолчанию
},
beforeRelease: function(RedisClient $r): bool {
// Если соединение разорвано — уничтожить ресурс
return $r->isConnected();
},
max: 5
);
См. также
- Pool::acquire — Получить ресурс из пула
- Pool::release — Вернуть ресурс в пул
- Pool::close — Закрыть пул