国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

Pool 連接池

多個(gè)協(xié)程共用同一個(gè)連接會(huì)導(dǎo)致數(shù)據(jù)混亂,所以需要使用連接池來管理數(shù)據(jù)庫、redis等連接資源。

提示
此特性需要 workerman>=5.1.0

注意

  • 底層自動(dòng)支持Swoole/Swow/Fiber/Select/Event驅(qū)動(dòng)
  • 當(dāng)使用Fiber/Select/Event驅(qū)動(dòng)時(shí),如果使用的是PDO redis等阻塞式擴(kuò)展,則自動(dòng)退化為只有一個(gè)連接的連接池

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);
        // 設(shè)置連接池創(chuàng)建連接的方法
        $this->pool->setConnectionCreator(function () use ($host, $port) {
            $redis = new \Redis();
            $redis->connect($host, $port);
            return $redis;
        });
        // 設(shè)置連接池銷毀連接的方法
        $this->pool->setConnectionCloser(function ($redis) {
            $redis->close();
        });
        // 設(shè)置心跳檢測(cè)方法
        $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 Server
$worker = new Worker('http://0.0.0.0:8001');
$worker->eventLoop = Swoole::class; // Or Swow::class or 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連接池(支持自動(dòng)獲取和歸還連接)

<?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();
        }
        // 從協(xié)程上下文中獲取連接,保證同一個(gè)協(xié)程使用同一個(gè)連接
        $pdo = Context::get('pdo');
        if (!$pdo) {
            // 從連接池中獲取連接
            $pdo = self::$pool->get();
            Context::set('pdo', $pdo);
            // 當(dāng)協(xié)程結(jié)束時(shí),自動(dòng)歸還連接
            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 Server
$worker = new Worker('http://0.0.0.0:8001');
$worker->eventLoop = Swoole::class; // Or Swow::class or 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
{

    /**
     * 構(gòu)造函數(shù)
     * @param int $max_connections 最大連接數(shù),默認(rèn)1
     * @param array $config = [
     *    'min_connections' => 1, // 最小連接數(shù),默認(rèn)為1
     *    'idle_timeout' => 60, // 連接空閑超時(shí)時(shí)間(秒),默認(rèn)為60秒,超過60秒后連接會(huì)被銷毀從連接池中移除
     *    'heartbeat_interval => 50, // 心跳檢測(cè)間隔時(shí)間(秒),默認(rèn)為50秒,每隔50秒會(huì)檢測(cè)一次連接是否正常
     *    'wait_timeout' => 10, // 獲取連接的等待超時(shí)時(shí)間(秒),默認(rèn)為10秒,超過10秒獲取連接失敗拋出異常
     * ] 
     */
    public function __construct(int $max_connections = 1, array $config = []);

    /**
     * 獲取一個(gè)連接
     */
    public function get(): mixed;

    /**
     * 歸還一個(gè)連接
     */
    public function put(object $connection): void;

    /**
     * 創(chuàng)建一個(gè)連接
     */
    public function createConnection(): object;

    /**
     * 關(guān)閉連接,并從連接池中移除
     */
    public function closeConnection(object $connection): void;

    /**
     * 獲取連接池中當(dāng)前的連接數(shù)(包括已獲取在使用中的連接和未獲取的連接)
     */
    public function getConnectionCount(): int;

    /**
     * 關(guān)閉連接池中的連接(不包括已獲取的在使用中的連接)
     */
    public function closeConnections(): void;

    /**
     * 設(shè)置連接池創(chuàng)建連接的方法
     */
    public function setConnectionCreator(callable $connectionCreateHandler): self

    /**
     * 設(shè)置連接池銷毀連接的方法
     */
    public function setConnectionCloser(callable $connectionDestroyHandler): self

    /**
     * 設(shè)置心跳檢測(cè)方法
     */
    public function setHeartbeatChecker(callable $connectionHeartbeatHandler): self

}
編輯于2025-02-07 00:10:04 完善本頁 +發(fā)起討論
贊助商