前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >🧨 webman-coroutine协程插件 1.0.0 正式发布

🧨 webman-coroutine协程插件 1.0.0 正式发布

作者头像
Tinywan
发布2024-10-10 19:12:44
发布2024-10-10 19:12:44
11700
代码可运行
举报
文章被收录于专栏:开源技术小栈
运行总次数:0
代码可运行

🐞 简介

🚀🚀 webman-coroutine 是一个 webman 开发框架生态下的协程基建支撑插件

🕷️ 功能

  1. 支持workerman 4.x的 swow 协程驱动能力,兼容workerman 5.x版本自带的swow协程驱动;
  2. 支持workerman 4.x的 swoole 协程驱动能力,兼容workerman 5.x版本自带的swoole协程驱动;
  3. 支持 ripple 协程驱动能力,兼容revolt (PHP-fiber)协程生态;
  4. 提供coroutine web server 用于实现具备协程能力的web服务;
  5. 支持纯 workerman 环境,支持 webman 开发框架

🪰 安装

通过composer安装

代码语言:javascript
代码运行次数:0
复制
composer require workbunny/webman-coroutine

输出日志

代码语言:javascript
代码运行次数:0
复制
/var/www/demo.webman.tinywan.com # 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: 3 installs, 0 updates, 0 removals
  - Locking composer/semver (3.4.3)
  - Locking swow/swow (v1.5.3)
  - Locking workbunny/webman-coroutine (1.0.2)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 3 installs, 0 updates, 0 removals
  - Installing composer/semver (3.4.3): Extracting archive
  - Installing swow/swow (v1.5.3): Extracting archive
  - Installing workbunny/webman-coroutine (1.0.2): Extracting archive
> support\Plugin::install
> support\Plugin::install
> support\Plugin::install
Create config/plugin/workbunny/webman-coroutine
3 package suggestions were added by new dependencies, use `composer suggest` to see details.
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.0 for workbunny/webman-coroutine

🪲 安装swow

使用./vendor/bin/swow-builder安装swow拓展,注意请关闭swoole环境

代码语言:javascript
代码运行次数:0
复制
/var/www/demo.webman.tinywan.com # ./vendor/bin/swow-builder
> 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
....
👀 Do you want to install it right now? (Y/n): Y
> 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. 配置server.php

修改事件驱动为event_loop()event_loop()用于自动判断当前环境适合的event loop和协程驱动

代码语言:javascript
代码运行次数:0
复制
'event_loop' => \Workbunny\WebmanCoroutine\event_loop(),

2. 启动webman

通过以下命令启动webman

代码语言:javascript
代码运行次数:0
复制
php -d extension=swow webman start

启动输出

代码语言:javascript
代码运行次数:0
复制
/var/www/demo.webman.tinywan.com # 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.workbunny.webman-coroutine.coroutine-web-server    http://[::]:8717            2             [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.

3. 新建控制器

CoroutineController.php 伪代码

代码语言:javascript
代码运行次数:0
复制
<?php
/**
 * @author Tinywan(ShaoBo Wan)
 * @date 2024/10/8 23:37
 */
declare(strict_types=1);

namespace app\controller;

use support\Request;
use Webman\Http\Response;
use Workbunny\WebmanCoroutine\Utils\Coroutine\Coroutine;
use Workbunny\WebmanCoroutine\Utils\WaitGroup\WaitGroup;

class CoroutineController
{
    public function index(Request $request): Response
    {
        $timeOne = microtime(true);
        $waitGroup = new WaitGroup();

        // 协程1
        $waitGroup->add();
        $coroutine1 = new Coroutine(function () use ($waitGroup) {
            task1();
            $waitGroup->done();
        });

        // 协程2
        $waitGroup->add();
        $coroutine2 = new Coroutine(function () use ($waitGroup) {
            task2();
            $waitGroup->done();
        });

        // 协程3
        $waitGroup->add();
        $coroutine3 = new Coroutine(function () use ($waitGroup) {
            task3();
            $waitGroup->done();
        });

        $waitGroup->wait();
        $timeTwo = microtime(true);
        $totalTime = $timeTwo - $timeOne;
        echo '[x] [总执行时间] ' . $totalTime . PHP_EOL;
        return json(['总执行时间' => $totalTime]);
    }
}

模拟执行任务方法

代码语言:javascript
代码运行次数:0
复制
/** @desc 任务1 */
function task1(): void
{
    $timeOne1 = microtime(true);
    for ($i = 1; $i <= 1; $i++) {
        sleep(1);
        echo '[x] [🕷️] [写入文件] [' . $i . '] ' . date('Y-m-d H:i:s') . PHP_EOL;
    }
    $timeTwo1 = microtime(true);
    echo '[x] [写入文件-总时间] ' . ($timeTwo1 - $timeOne1) . PHP_EOL . PHP_EOL;
}

/** @desc 任务2 */
function task2(): void
{
    $timeOne2 = microtime(true);
    for ($i = 1; $i <= 3; $i++) {
        sleep(1);
        echo '[x] [🍁] [发送邮件] [' . $i . '] ' . date('Y-m-d H:i:s') . PHP_EOL;
    }
    $timeTwo2 = microtime(true);
    echo '[x] [发送邮件-总时间] ' . ($timeTwo2 - $timeOne2) . PHP_EOL . PHP_EOL;
}

/** @desc 任务3 */
function task3(): void
{
    $timeOne3 = microtime(true);
    for ($i = 1; $i <= 5; $i++) {
        sleep(1);
        echo '[x] [🌾] [发送短信] [' . $i . '] ' . date('Y-m-d H:i:s') . PHP_EOL;
    }
    $timeTwo3 = microtime(true);
    echo '[x] [发送短信-总时间] ' . ($timeTwo3 - $timeOne3) . PHP_EOL . PHP_EOL;
}

4、执行Http请求

请求地址:http://127.0.0.1:8217/coroutine/index

控制台输出结果

代码语言:javascript
代码运行次数:0
复制
[x] [🕷️] [写入文件] [1] 2024-10-08 23:48:56
[x] [写入文件-总时间] 0.9472222328186

[x] [🍁] [发送邮件] [1] 2024-10-08 23:48:56
[x] [🌾] [发送短信] [1] 2024-10-08 23:48:56
[x] [🍁] [发送邮件] [2] 2024-10-08 23:48:57
[x] [🌾] [发送短信] [2] 2024-10-08 23:48:57
[x] [🍁] [发送邮件] [3] 2024-10-08 23:48:58
[x] [发送邮件-总时间] 2.9497091770172

[x] [🌾] [发送短信] [3] 2024-10-08 23:48:58
[x] [🌾] [发送短信] [4] 2024-10-08 23:48:59
[x] [🌾] [发送短信] [5] 2024-10-08 23:49:00
[x] [发送短信-总时间] 4.9520699977875

[x] [总执行时间] 4.9987840652466
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🐞 简介
  • 🕷️ 功能
  • 🪰 安装
  • 🪲 安装swow
  • 🐜 webman 使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档