Pool::acquire

(PHP 8.6+, True Async 1.0)

public Pool::acquire(int $timeout = 0): mixed

Получает ресурс из пула. Если свободных ресурсов нет и достигнут максимальный лимит, корутина блокируется до появления свободного ресурса.

Если в пуле есть свободный ресурс, он выдаётся немедленно. Если свободных нет, но лимит max не достигнут, создаётся новый ресурс через factory. Иначе вызов ожидает освобождения ресурса.

Параметры

timeout
Максимальное время ожидания в миллисекундах. 0 — ожидание без ограничения по времени. При превышении таймаута выбрасывается PoolException.

Возвращаемые значения

Возвращает ресурс из пула.

Ошибки

Выбрасывает Async\PoolException, если:

Примеры

Пример #1 Базовое использование

<?php

use Async\Pool;

$pool = new Pool(
    factory: fn() => new PDO('mysql:host=localhost;dbname=app', 'user', 'pass'),
    max: 5
);

// Получить соединение (ждёт если нужно)
$conn = $pool->acquire();

try {
    $stmt = $conn->prepare('SELECT * FROM users WHERE id = ?');
    $stmt->execute([42]);
    $user = $stmt->fetch();
} finally {
    $pool->release($conn);
}

Пример #2 С таймаутом

<?php

use Async\Pool;
use Async\PoolException;

$pool = new Pool(
    factory: fn() => new PDO('mysql:host=localhost;dbname=app', 'user', 'pass'),
    max: 2
);

try {
    $conn = $pool->acquire(timeout: 5000); // ждать не более 5 секунд
    // работа с соединением...
    $pool->release($conn);
} catch (PoolException $e) {
    echo "Не удалось получить ресурс: {$e->getMessage()}\n";
}

См. также