Pool कनेक्शन पूल

एकाधिक सहकारियों द्वारा एक ही कनेक्शन का साझा करना डेटा के मिश्रण का कारण बन सकता है, इसलिए डेटाबेस, redis आदि कनेक्शन संसाधनों का प्रबंधन करने के लिए कनेक्शन पूल का उपयोग करना आवश्यक है।

सूचना
इस विशेषता की आवश्यकता है workerman>=5.1.0

ध्यान दें

  • आधारभूत रूप से Swoole/Swow/Fiber/Select/Event संचालित का स्वत: समर्थन है
  • जब Fiber/Select/Event संचालित का उपयोग किया जाता है, यदि PDO redis जैसी अवरुद्ध विस्तारण का उपयोग किया जाता है, तो यह स्वचालित रूप से केवल एक कनेक्शन वाले कनेक्शन पूल में बदल जाता है

Redis कनेक्शन पूल

<?php
use Workerman\Connection\TcpConnection;
use Workerman\Coroutine\Pool;
use Workerman\Events\Swoole;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';

class RedisPool
{

    private Pool $pool;

    public function __construct($host, $port, $max_connections = 10)
    {
        $this->pool = new Pool($max_connections);
        // कनेक्शन पूल में कनेक्शन बनाने के लिए विधि सेट करें
        $this->pool->setConnectionCreator(function () use ($host, $port) {
            $redis = new \Redis();
            $redis->connect($host, $port);
            return $redis;
        });
        // कनेक्शन पूल में कनेक्शन नष्ट करने के लिए विधि सेट करें
        $this->pool->setConnectionCloser(function ($redis) {
            $redis->close();
        });
        // हार्टबीट जांच विधि सेट करें
        $this->pool->setHeartbeatChecker(function ($redis) {
            $redis->ping();
        });
    }

    // कनेक्शन प्राप्त करें
    public function get(): \Redis
    {
        return $this->pool->get();
    }

    // कनेक्शन वापस करें
    public function put($redis): void
    {
        $this->pool->put($redis);
    }
}

// Http सर्वर
$worker = new Worker('http://0.0.0.0:8001');
$worker->eventLoop = Swoole::class; // या Swow::class या Fiber::class
$worker->onMessage = function (TcpConnection $connection, Request $request) {
    static $pool;
    if (!$pool) {
        $pool = new RedisPool('127.0.0.1', 6379, 10);
    }
    $redis = $pool->get();
    $redis->set('key', 'hello');
    $value = $redis->get('key');
    $pool->put($redis);
    $connection->send($value);
};

Worker::runAll();

MySQL कनेक्शन पूल (स्वचालित कनेक्शन प्राप्त करने और वापस करने का समर्थन)

<?php
use Workerman\Connection\TcpConnection;
use Workerman\Coroutine\Context;
use Workerman\Coroutine;
use Workerman\Coroutine\Pool;
use Workerman\Events\Swoole;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';

class Db
{
    private static ?Pool $pool = null;

    public static function __callStatic($name, $arguments)
    {
        if (self::$pool === null) {
            self::initializePool();
        }
        // सहकारी संदर्भ से कनेक्शन प्राप्त करें, यह सुनिश्चित करने के लिए कि एक ही सहकारी एक ही कनेक्शन का उपयोग करता है
        $pdo = Context::get('pdo');
        if (!$pdo) {
            // कनेक्शन पूल से कनेक्शन प्राप्त करें
            $pdo = self::$pool->get();
            Context::set('pdo', $pdo);
            // जब सहकारी समाप्त होता है, तो कनेक्शन स्वचालित रूप से वापस करें
            Coroutine::defer(function () use ($pdo) {
                self::$pool->put($pdo);
            });
        }
        return call_user_func_array([$pdo, $name], $arguments);
    }

    private static function initializePool(): void
    {
        self::$pool = new Pool(10);
        self::$pool->setConnectionCreator(function () {
            return new \PDO('mysql:host=127.0.0.1;dbname=your_database', 'your_username', 'your_password');
        });
        self::$pool->setConnectionCloser(function ($pdo) {
            $pdo = null;
        });
        self::$pool->setHeartbeatChecker(function ($pdo) {
            $pdo->query('SELECT 1');
        });
    }

}

// Http सर्वर
$worker = new Worker('http://0.0.0.0:8001');
$worker->eventLoop = Swoole::class; // या Swow::class या Fiber::class
$worker->onMessage = function (TcpConnection $connection, Request $request) {
    $value = Db::query('SELECT NOW() as now')->fetchAll();
    $connection->send(json_encode($value));
};

Worker::runAll();

इंटरफेस विवरण

interface PoolInterface
{

    /**
     * कन्स्ट्रक्टर
     * @param int $max_connections अधिकतम कनेक्शन संख्या, डिफ़ॉल्ट 1
     * @param array $config = [
     *    'min_connections' => 1, // न्यूनतम कनेक्शन संख्या, डिफ़ॉल्ट 1
     *    'idle_timeout' => 60, // कनेक्शन निष्क्रिय समय समाप्त समय (सेकंड), डिफ़ॉल्ट 60 सेकंड है, 60 सेकंड बाद कनेक्शन को नष्ट कर दिया जाएगा और कनेक्शन पूल से हटा दिया जाएगा
     *    'heartbeat_interval' => 50, // हार्टबीट जांच अंतराल समय (सेकंड), डिफ़ॉल्ट 50 सेकंड है, हर 50 सेकंड में एक बार कनेक्शन की स्थिति की जांच की जाएगी
     *    'wait_timeout' => 10, // कनेक्शन प्राप्त करने की प्रतीक्षा समय समाप्त (सेकंड), डिफ़ॉल्ट 10 सेकंड है, 10 सेकंड से अधिक समय पर कनेक्शन प्राप्त करने में विफलता की स्थिति में अपवाद उत्पन्न होगा
     * ] 
     */
    public function __construct(int $max_connections = 1, array $config = []);

    /**
     * एक कनेक्शन प्राप्त करें
     */
    public function get(): mixed;

    /**
     * एक कनेक्शन वापस करें
     */
    public function put(object $connection): void;

    /**
     * एक कनेक्शन बनाएँ
     */
    public function createConnection(): object;

    /**
     * कनेक्शन बंद करें, और कनेक्शन पूल से हटा दें
     */
    public function closeConnection(object $connection): void;

    /**
     * वर्तमान में कनेक्शन पूल में कनेक्शनों की संख्या प्राप्त करें (जिसमें उपयोग में ले गए और अभी तक प्राप्त नहीं किए गए कनेक्शन शामिल हैं)
     */
    public function getConnectionCount(): int;

    /**
     * कनेक्शन पूल में कनेक्शनों को बंद करें (जिसमें उपयोग में ले गए कनेक्शन शामिल नहीं हैं)
     */
    public function closeConnections(): void;

    /**
     * कनेक्शन पूल में कनेक्शन बनाने की विधि सेट करें
     */
    public function setConnectionCreator(callable $connectionCreateHandler): self;

    /**
     * कनेक्शन पूल में कनेक्शन नष्ट करने की विधि सेट करें
     */
    public function setConnectionCloser(callable $connectionDestroyHandler): self;

    /**
     * हार्टबीट जांच विधि सेट करें
     */
    public function setHeartbeatChecker(callable $connectionHeartbeatHandler): self;
}