utopia-php/pools

一个用于管理连接池的简单库

0.5.0 2024-04-19 11:11 UTC

README

Build Status Total Downloads Discord

Utopia pools库是一个简单轻量级的库,用于管理长生存连接池。这个库旨在尽可能简单且易于学习和使用。该库由Appwrite团队维护。

虽然这个库是Utopia框架项目的一部分,但它不依赖于其他库,可以独立于任何其他PHP项目或框架使用。

概念

  • - 一系列长生存连接。您可以从中弹出连接使用,然后将其推回池中以便重用。
  • 连接 - 一个对象,以资源的形式持有长期存在的数据库或其他外部连接。PDO对象或Redis客户端是可以用于连接中的资源示例。
  • - 多个池的集合。

入门指南

使用composer安装

composer require utopia-php/pools

示例

use PDO;
use Utopia\Pools\Pool;
use Utopia\Pools\Group;

$pool = new Pool('mysql-pool', 1 /* number of connections */, function() {
    $host = '127.0.0.1';
    $db   = 'test';
    $user = 'root';
    $pass = '';
    $charset = 'utf8mb4';

    try {
        $pdo = new PDO("mysql:host=$host;dbname=$db;charset=$charset", $user, $pass);
    } catch (\PDOException $e) {
        throw new \PDOException($e->getMessage(), (int)$e->getCode());
    }

    return $pdo;
});

$pool->setReconnectAttempts(3); // number of attempts to reconnect
$pool->setReconnectSleep(5); // seconds to sleep between reconnect attempts

$pool->setRetryAttempts(3); // number of attempts to get connection
$pool->setRetrySleep(5); // seconds to sleep between failed pop-connection attempts

$connection = $pool->pop(); // Get a connection from the pool
$connection->getID(); // Get the connection ID
$connection->getResource(); // Get the connection resource

$pool->push($connection); // Return the connection to the pool

$pool->reclaim(); // Recalim the pool, return all active connections automatically

$pool->count(); // Get the number of available connections

$pool->isEmpty(); // Check if the pool is empty

$pool->isFull(); // Check if the pool is full

$group = new Group(); // Create a group of pools
$group->add($pool); // Add a pool to the group
$group->get('mysql-pool'); // Get a pool from the group
$group->setReconnectAttempts(3); // Set the number of reconnect attempts for all pools
$group->setReconnectSleep(5); // Set the sleep time between reconnect attempts for all pools

重新连接和重试

重新连接和重试逻辑都用于pop()方法来处理问题场景。两者都允许您配置2个属性

  • attempts - 当出现问题时,库将重试多少次
  • sleep - 库在下次重试尝试之前将等待多长时间

重新连接设置用于您的连接初始化回调抛出异常时。例如,当与SQL服务器的握手失败时,可能会发生这种情况。

重试设置用于连接池为空且没有更多连接可以弹出时。例如,当您的服务器支持的并发操作数量多于您的池时,可能会发生这种情况。

系统要求

Utopia框架需要PHP 8.0或更高版本。我们建议在可能的情况下始终使用最新的PHP版本。

测试

要运行所有单元测试,请使用以下Docker命令

docker compose exec tests vendor/bin/phpunit --configuration phpunit.xml tests

要运行静态代码分析,请使用以下Psalm命令

docker compose exec tests vendor/bin/psalm --show-info=true

版权和许可

MIT许可证(MIT) http://www.opensource.org/licenses/mit-license.php