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
);

Дивіться також