前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >workerman5.0篇〡Fiber、Swoole、Swow三协程并行运行

workerman5.0篇〡Fiber、Swoole、Swow三协程并行运行

作者头像
Tinywan
发布2025-01-07 08:21:22
发布2025-01-07 08:21:22
14500
代码可运行
举报
文章被收录于专栏:开源技术小栈开源技术小栈
运行总次数:0
代码可运行

V5 主要特性

  • 支持Fiber协程
  • 支持Swoole协程
  • 支持Swow协程

注意

  • 同一个Worker中Fiber协程、Swoole协程、Swow协程无法共存,只能使用其中一种。
  • 不同Worker可以设置不同的协程驱动类型

开源技术小栈本章节就是通过为不同Worker设置不同的协程驱动类型来演示webman框架是如何支持多个协程事件驱动的。

Fiber协程

代码语言:javascript
代码运行次数:0
复制
composer require revolt/event-loop

在workerman中使用

代码语言:javascript
代码运行次数:0
复制
<?php
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('http://0.0.0.0:8888');
$worker->eventLoop = \Workerman\Events\Revolt::class;
$worker->onMessage = function (TcpConnection $connection, Request $request) {
    $connection->send('hello workerman');
};

Worker::runAll();

在webman中使用

Fiber协程,在webman框架安装后,直接启动webman,事件驱动默认会切换到revolt/event-loop事件驱动。

启动webman效果

代码语言:javascript
代码运行次数:0
复制
Workerman[start.php] start in DEBUG mode
------------------------------------------------ WORKERMAN -------------------------------------------------
Workerman/5.0.0         PHP/8.3.15 (Jit off)          Linux/5.10.102.1-microsoft-standard-WSL2
------------------------------------------------- WORKERS --------------------------------------------------
event-loop  proto       user        worker              listen                 count       state
revolt      tcp         root        webman              http://0.0.0.0:8288    8            [OK]
revolt      tcp         root        monitor             none                   1            [OK]
------------------------------------------------------------------------------------------------------------

Swoole协程

安装教程:https://wiki.swoole.com/zh-cn/#/environment

查看Swoole版本

代码语言:javascript
代码运行次数:0
复制
pecl info swoole

About pecl.php.net/swoole-6.0.0
===============================
Release Type          PECL-style PHP extension (source code)
Name                  swoole
Channel               pecl.php.net
Maintainers           Tianfeng Han <rango@swoole.com> (lead)
                      Lu Fei <lufei@php.net> (developer)
                      Bruce Dou <doubaokun@php.net> (developer)
Release Date          2024-12-16 08:02:22
Release Version       6.0.0 (stable)
API Version           6.0 (stable)
License               Apache2.0
Required Dependencies PHP version 8.1.0
                      PEAR installer version 1.4.0 or newer
package.xml version   2.0
Last Modified         2025-01-03 13:31
Previous Installed    - None -
Version

Swoole协程服务

SwooleCoroutine.php 每3秒执行一次协程任务

代码语言:javascript
代码运行次数:0
复制
<?php
/**
 * @desc SwooleCoroutine.php 
 * @author Tinywan(ShaoBo Wan)
 */
declare(strict_types=1);

namespace app\common\coroutine;

use Workerman\Crontab\Crontab;

class SwooleCoroutine
{
    public function onWorkerStart(): void
    {
        /** 每3秒执行一次协程任务 */
        new Crontab('*/3 * * * * *', function () {
            $this->execCoroutineTask();
        });
    }

    private function execCoroutineTask(): void
    {
        echo '[x] Swoole Coroutine 开始执行协程任务' . PHP_EOL;
        /** go函数是swoole的开启协程函数,用于开启一个协程 */
        go('task1');
        go('task2');
        go('task3');
    }
}

开源技术小栈go函数是swoole的开启协程函数,用于开启一个协程。

协程伪代码

代码语言:javascript
代码运行次数:0
复制
function task1(): void
{
    for ($i=0;$i<=5;$i++){
        //写入文件,大概要3000微秒
        usleep(3000);
        echo '[x] [写入文件] ['.$i.'] ' . date('Y-m-d H:i:s') . PHP_EOL;
        \Co::sleep(0.001);//挂起当前协程,0.001秒后恢复//相当于切换协程
    }
}
function task2(): void
{
    for ($i=0;$i<=10;$i++){
        //发送邮件给500名会员,大概3000微秒
        usleep(3000);
        echo '[x] [发送邮件] ['.$i.'] ' . date('Y-m-d H:i:s') . PHP_EOL;
        \Co::sleep(0.001);//挂起当前协程,0.001秒后恢复//相当于切换协程
    }
}

function task3(): void
{
    for ($i=0;$i<=15;$i++){
        //模拟插入100条数据,大概3000微秒
        usleep(3000);
        echo '[x] [插入数据] ['.$i.'] ' . date('Y-m-d H:i:s') . PHP_EOL;
        \Co::sleep(0.001);//挂起当前协程,0.001秒后恢复//相当于切换协程
    }
}

开源技术小栈自定义Swoole协程进程,在config/process.php中添加如下配置

代码语言:javascript
代码运行次数:0
复制
'swoole-coroutine' => [
    'handler' => \app\common\coroutine\SwooleCoroutine::class,
    'eventLoop' => \Workerman\Events\Swoole::class,
],

配置说明

  • 指定进程类handler\app\common\coroutine\SwooleCoroutine::class
  • 指定进程事件驱动类eventLoop \Workerman\Events\Swoole::class

启动webman

代码语言:javascript
代码运行次数:0
复制
$ php start.php start

Workerman[start.php] start in DEBUG mode
------------------------------------------------ WORKERMAN -------------------------------------------------
Workerman/5.0.0         PHP/8.3.15 (Jit off)          Linux/5.10.102.1-microsoft-standard-WSL2
------------------------------------------------- WORKERS --------------------------------------------------
event-loop  proto       user        worker              listen                 count       state
revolt      tcp         root        webman              http://0.0.0.0:8288    8            [OK]
swoole      tcp         root        swoole-coroutine    none                   8            [OK]
revolt      tcp         root        monitor             none                   1            [OK]
------------------------------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.

查看webman服务

代码语言:javascript
代码运行次数:0
复制
$ php start.php status

Workerman[start.php] status
Start worker in DEBUG mode.
---------------------------------------------------GLOBAL STATUS---------------------------------------------------------
Workerman/5.0.0         PHP/8.3.15 (Jit off)          Linux/5.10.102.1-microsoft-standard-WSL2
start time:2025-01-03 22:55:23   run 0 days 0 hours   load average: 1.73, 0.79, 0.77
3 workers    17 processes
name                 event-loop     exit_status     exit_count
webman               revolt         0               0
swoole-coroutine     swoole         0               0
monitor              revolt         0               0
---------------------------------------------------PROCESS STATUS--------------------------------------------------------
pid     memory  listening           name             connections send_fail timers  total_request qps    status
20277   8.47M   http://0.0.0.0:8288 webman           0           0         2       0             0      [idle]
20278   8.47M   http://0.0.0.0:8288 webman           0           0         2       0             0      [idle]
20279   8.47M   http://0.0.0.0:8288 webman           0           0         2       0             0      [idle]
20280   8.47M   http://0.0.0.0:8288 webman           0           0         2       0             0      [idle]
20281   8.47M   http://0.0.0.0:8288 webman           0           0         2       0             0      [idle]
20282   8.47M   http://0.0.0.0:8288 webman           0           0         2       0             0      [idle]
20283   8.47M   http://0.0.0.0:8288 webman           0           0         2       0             0      [idle]
20284   8.47M   http://0.0.0.0:8288 webman           0           0         2       0             0      [idle]
20285   8.25M   none                swoole-coroutine 0           0         3       0             0      [idle]
20286   8.25M   none                swoole-coroutine 0           0         3       0             0      [idle]
20287   8.25M   none                swoole-coroutine 0           0         3       0             0      [idle]
20288   8.25M   none                swoole-coroutine 0           0         3       0             0      [idle]
20289   8.25M   none                swoole-coroutine 0           0         3       0             0      [idle]
20290   8.25M   none                swoole-coroutine 0           0         3       0             0      [idle]
20291   8.25M   none                swoole-coroutine 0           0         3       0             0      [idle]
20292   8.25M   none                swoole-coroutine 0           0         3       0             0      [idle]
20293   8.49M   none                monitor          0           0         4       0             0      [idle]
---------------------------------------------------PROCESS STATUS--------------------------------------------------------
Summary 142.25M -                   -                0           0         44      0             0      [Summary]

执行结果

代码语言:javascript
代码运行次数:0
复制
[x] Swoole Coroutine 开始执行协程任务
[x] [写入文件] [0] 2025-01-03 22:47:09
[x] [发送邮件] [0] 2025-01-03 22:47:09
[x] [插入数据] [0] 2025-01-03 22:47:09
[x] [写入文件] [1] 2025-01-03 22:47:09
[x] [发送邮件] [1] 2025-01-03 22:47:09
[x] [插入数据] [1] 2025-01-03 22:47:09
[x] [写入文件] [2] 2025-01-03 22:47:09
[x] [发送邮件] [2] 2025-01-03 22:47:09
[x] [插入数据] [2] 2025-01-03 22:47:09
[x] [写入文件] [3] 2025-01-03 22:47:09
[x] [发送邮件] [3] 2025-01-03 22:47:09
[x] [插入数据] [3] 2025-01-03 22:47:09
[x] [写入文件] [4] 2025-01-03 22:47:09
[x] [发送邮件] [4] 2025-01-03 22:47:09
[x] [插入数据] [4] 2025-01-03 22:47:09
[x] [写入文件] [5] 2025-01-03 22:47:09
[x] [发送邮件] [5] 2025-01-03 22:47:09
[x] [插入数据] [5] 2025-01-03 22:47:09
[x] [发送邮件] [6] 2025-01-03 22:47:09
[x] [插入数据] [6] 2025-01-03 22:47:09
[x] [发送邮件] [7] 2025-01-03 22:47:09
[x] [插入数据] [7] 2025-01-03 22:47:09
[x] [发送邮件] [8] 2025-01-03 22:47:09
[x] [插入数据] [8] 2025-01-03 22:47:09
[x] [发送邮件] [9] 2025-01-03 22:47:09
[x] [插入数据] [9] 2025-01-03 22:47:09
[x] [发送邮件] [10] 2025-01-03 22:47:09
[x] [插入数据] [10] 2025-01-03 22:47:09
[x] [插入数据] [11] 2025-01-03 22:47:09
[x] [插入数据] [12] 2025-01-03 22:47:09
[x] [插入数据] [13] 2025-01-03 22:47:09
[x] [插入数据] [14] 2025-01-03 22:47:09
[x] [插入数据] [15] 2025-01-03 22:47:09

安装Swow拓展

代码语言:javascript
代码运行次数:0
复制
composer require swow/swow

开源技术小栈注意:SwowSwoole两个扩展只能选择开启一个,否则启动会报错

代码语言:javascript
代码运行次数:0
复制
PHP Warning: Swow is incompatible with Swoole 
because both of Swow and Swoole provide the similar functionality through 
different implementations. 
Please disable one of Swow or Swoole and re-run. in Unknown on line 0
PHP Fatal error: Unable to start Swow module in Unknown on line 0

开源技术小栈如何使用请看:webman如何使用swow事件驱动和协程?

参考

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • V5 主要特性
  • Fiber协程
    • 在workerman中使用
    • 在webman中使用
    • 启动webman效果
  • Swoole协程
    • 查看Swoole版本
    • Swoole协程服务
    • 协程伪代码
    • 启动webman
    • 查看webman服务
    • 执行结果
  • 安装Swow拓展
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档