成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

高性能PHP框架webman協程Redis動態連接池

開發 前端
在webman框架的控制器使用的時候,存在會被多次調用Pool::create()方法多次創建重復區域會拋出異常,可以在config/bootstrap.php中占位初始化。

?? 簡介

 webman-coroutine 是一個 webman 開發框架生態下的協程基建支撐插件

?? 起源

  • workerman 4.x 及基于其作為運行容器的 webman 框架不支持協程
  • workerman 5.x 及基于其作為運行容器的 webman 框架不具備完備的協程能力
  • workerman / webman 沒有一個較為統一的協程使用方式,導致切換協程驅動的開發成本較高,試錯成本較高
  • 自行實現協程版worker、server開發成本較高,試錯成本較高

??? 目的

  • 提供 workerman/webman 多樣的基礎協程事件庫,兼容支持workerman 4.x和workerman 5.x的協程驅動

revolt/PHP-fiber

swow

swoole

ripple

  • 提供 workerman/webman 統一的協程開發工具,兼容非協程環境
  • 協程通道:Utils/Channel
  • 協程等待:Utils/WaitGroup
  • 協程:Utils/Coroutine
  • 協程化Worker:Utils/Worker
  • 對象池:Utils/Pool

?? 愿景

  1. 在 workerman/webman 開發環境下,提供一套簡單的協程工具包,降低認知負荷。
  2. 在 workerman/webman 開發環境下,嘗試實現一套兼容協程與非協程開發的方案,讓選擇和擺脫方案更簡單,避免更多的焦慮。
  3. 在 workerman/webman 開發環境下,盡可能實現對官方組件的無侵入式協程化改造(雖然很難,但也想試試)。
  4. 希望在代碼的實現上能夠給更多PHP開發帶來一些幫助,甚至靈感。

?? 安裝

通過composer安裝

composer require workbunny/webman-coroutine

安裝日志

# composer require workbunny/webman-coroutine
./composer.json has been updated
Running composer update workbunny/webman-coroutine
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 1 update, 0 removals
  - Upgrading workbunny/webman-coroutine (1.1.4 => 1.2.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 4 installs, 0 updates, 1 removal
  - Downloading tinywan/exception-handler (v1.5.4)
  - Downloading workbunny/webman-coroutine (1.2.1)
> support\Plugin::uninstall
  - Removing openspout/openspout (v4.26.0)
  - Installing composer/semver (3.4.3): Extracting archive
  - Installing swow/swow (v1.5.3): Extracting archive
  - Installing tinywan/exception-handler (v1.5.4): Extracting archive
  - Installing workbunny/webman-coroutine (1.2.1): Extracting archive
> support\Plugin::install
> support\Plugin::install
> support\Plugin::install
> support\Plugin::install
Create config/plugin/workbunny/webman-coroutine
Generating autoload files
55 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found.
Using version ^1.2 for workbunny/webman-coroutine

??安裝 swow

通過composer安裝

composer require swow/swow

使用./vendor/bin/swow-builder安裝swow拓展

vendor/bin/swow-builder --rebuild --install
> cd /var/www/demo.webman.tinywan.com/vendor/swow/swow/ext && \
phpize --clean
Cleaning..
? Clean done

> cd /var/www/demo.webman.tinywan.com/vendor/swow/swow/ext && \
phpize && \
./configure
Configuring for:
PHP Api Version:         20230831
Zend Module Api No:      20230831
Zend Extension Api No:   420230831
checking for grep that handles long lines and -e... /bin/grep

Directive => Local Value => Master Value
swow.enable => On => On
swow.async_threads => 0 => 0
swow.async_file => On => On
swow.async_tty => On => On

> cd /var/www/demo.webman.tinywan.com/vendor/swow/swow/ext && \
make install
Installing shared extensions:     /usr/local/lib/php/extensions/no-debug-non-zts-20230831/
? Install done

?????? All tasks have been completed ??????

?? webman 使用

1. 配置config/server.php

修改事件驅動為event_loop(),event_loop()用于自動判斷當前環境適合的event loop和協程驅動

'event_loop' => \Workbunny\WebmanCoroutine\event_loop(),

2. 占位初始化

在webman框架的控制器使用的時候,存在會被多次調用Pool::create()方法多次創建重復區域會拋出異常,可以在config/bootstrap.php中占位初始化。新增如下配置

<?php
return [
    // 其他配置
    \app\common\CoroutinePool::class
];

CoroutinePool.php協程連接池

<?php
/**
 * @desc CoroutinePool.php 描述信息
 * @author Tinywan(ShaoBo Wan)
 */
declare(strict_types=1);

namespace app\common;

use Webman\Bootstrap;
use Workbunny\WebmanCoroutine\Utils\Pool\Pool;
use Workerman\Worker;

class CoroutinePool implements Bootstrap
{
    /***
     * @desc start
     * @param Worker|null $worker
     * @author Tinywan(ShaoBo Wan)
     */
    public static function start(?Worker $worker)
    {
        /** 為redis占位 */
        Pool::init('redis',false);
    }
}

3. 動態池化

CoroutineController控制器偽代碼

<?php
/**
 * @author Tinywan(ShaoBo Wan)
 * @date 2024/10/17 23:37
 */
declare(strict_types=1);

namespace app\controller;

use Illuminate\Redis\Connections\Connection;
use support\Response;
use Workbunny\WebmanCoroutine\Utils\Pool\Pool;

class CoroutineController
{
    /***
     * @desc Redis 連接池
     * @author Tinywan(ShaoBo Wan)
     */
    public function pool(): Response
    {
        /** 獲取redis占位 */
        $pools = Pool::get('redis', null);
        /** 根據配置池大小判斷是否需要追加,假設你存在這樣的配置 */
        if (count($pools) < config('redis.pool_size')) {
            /** 新建redis連接 */
            $config = config('redis');
            $redis = new \Illuminate\Redis\RedisManager('', 'phpredis', $config);
            /** 追加一個redis連接對象,資源類型不用clone */
            Pool::append('redis', (int)array_key_last($pools) + 1, $redis, false);
        }

        $start = microtime(true);
        /** 等待閑置redis */
        $redis = Pool::waitForIdle('redis', function (Pool $pool): \Redis {
            /** @var  Connection $connection */
            $connection = $pool->getElement();
            /** 獲取redis連接  */
            return $connection->client();
        });
        /** 執行Redis命令  */
        $res = $redis->lPush('webman:coroutine:key', '開源技術小棧' . date('Y-m-d H:i:s'));
        $time = (string)(microtime(true) - $start);
        return json(['time' => $time, 'res' => $res]);
    }
}

4. 啟動webman

通過以下命令啟動webman

php -d extension=swow webman start

啟動成功輸出

# php -d extension=swow webman start
Workerman[webman] start in DEBUG mode
---------------------------------------------------- WORKERMAN -----------------------------------------------------
Workerman version:4.1.15          PHP version:8.3.9           Event-Loop:Workbunny\WebmanCoroutine\Events\SwowEvent
----------------------------------------------------- WORKERS ------------------------------------------------------
proto   user            worker                       listen                      processes    status
tcp     root            webman                       http://0.0.0.0:8217         8             [OK] 
tcp     root            monitor                      none                        1             [OK] 
tcp     root            plugin.saiadmin.task         none                        1             [OK] 
tcp     root            plugin.saiadmin.websocket    websocket://0.0.0.0:9527    1             [OK] 
--------------------------------------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.

5. 請求訪問

訪問地址 http://127.0.0.1:8217/coroutine/pool

{
  "time": "0.069719791412354",
  "res": 1
}


Redis數據存儲結果

圖片圖片

責任編輯:武曉燕 來源: 開源技術小棧
相關推薦

2025-01-26 00:00:15

PHP協程控制權

2024-11-06 11:25:06

2018-10-10 14:27:34

數據庫連接池MySQL

2023-11-01 11:27:10

Linux協程

2024-11-01 11:46:59

2024-01-10 08:17:50

HikariCP數據庫Spring

2025-03-26 01:22:00

NtyCo協程框架

2019-12-30 15:30:13

連接池請求PHP

2021-03-24 09:06:01

MySQL長連接短連接

2016-10-28 17:39:47

phpgolangcoroutine

2017-05-02 11:38:00

PHP協程實現過程

2018-12-04 14:00:41

協程編程模式PHP

2009-11-12 09:25:21

ADO.NET連接池

2011-06-01 13:54:10

MySQL

2012-08-08 10:10:31

PHP

2017-08-10 15:50:44

PHP協程阻塞

2024-09-05 09:41:57

2025-02-28 09:04:08

2023-12-27 08:07:49

Golang協程池Ants

2025-03-21 06:20:00

連接池系統數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一二区视频 | 欧美日韩午夜精品 | 日韩精品av一区二区三区 | 久久91精品久久久久久9鸭 | 中文一区二区 | 免费观看成人鲁鲁鲁鲁鲁视频 | 国产一级黄色网 | 中文字幕 国产精品 | 一区二区三区小视频 | 国产精品亚洲综合 | 一区精品视频在线观看 | 亚洲综合无码一区二区 | 欧美中文字幕一区二区三区亚洲 | 琪琪午夜伦伦电影福利片 | 激情av免费看 | 久综合 | 亚洲国产精品视频一区 | 精品美女久久久 | av网站免费看 | 亚洲精品久久 | 亚洲欧洲精品成人久久奇米网 | 91九色porny首页最多播放 | 欧美日韩高清免费 | 欧美一区二区在线视频 | 热99精品视频 | 日韩国产一区二区三区 | av中文字幕在线观看 | 视频一区二区中文字幕日韩 | 一区二区三区视频 | www.国产精品 | 91一区二区 | 亚洲一区免费在线 | 日韩成人免费av | 欧美在线观看一区二区 | 日韩在线国产精品 | 国产成人小视频 | 天天干夜夜操 | 国产三区视频在线观看 | 国产精品久久久久久婷婷天堂 | 91香蕉视频在线观看 | 久久精品免费观看 |