前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >webman如何使用swow事件驱动和协程?

webman如何使用swow事件驱动和协程?

作者头像
Tinywan
发布2024-09-27 16:07:15
581
发布2024-09-27 16:07:15
举报
文章被收录于专栏:开源技术小栈

Swow 是什么?

Swow 是一个专注于并发 I/O 的跨平台协程引擎,它致力于使用最小 C 核心及多数 PHP 代码以支持 PHP 高性能网络编程,具有极佳的扩展性与强大的调试能力,最大化开发者的编程效率。

更多请看:PHP高性能纯协程网络通信引擎Swow

安装

安装workerman 5.0
代码语言:javascript
复制
composer require workerman/workerman v5.0.0-beta.7

安装日志

代码语言:javascript
复制
composer require workerman/workerman v5.0.0-beta.7
./composer.json has been updated
Running composer update workerman/workerman
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 1 update, 0 removals
  - Upgrading workerman/workerman (v5.0.0-beta.1 => v5.0.0-beta.7)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 1 update, 0 removals
  - Downloading workerman/workerman (v5.0.0-beta.7)
  - Upgrading workerman/workerman (v5.0.0-beta.1 => v5.0.0-beta.7): Extracting archive
> support\Plugin::install
Generating autoload files
11 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found.
安装swow拓展

拉取源码

代码语言:javascript
复制
composer require swow/swow

安装日志

代码语言:javascript
复制
./composer.json has been updated
Running composer update swow/swow
Loading composer repositories with package information
Updating dependencies
Lock file operations: 5 installs, 0 updates, 0 removals
  - Locking composer/semver (3.4.2)
  - Locking psr/http-client (1.0.3)
  - Locking psr/http-factory (1.0.2)
  - Locking psr/http-message (2.0)
  - Locking swow/swow (v1.5.3)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 5 installs, 0 updates, 0 removals
  - Installing psr/http-message (2.0): Extracting archive
  - Installing psr/http-factory (1.0.2): Extracting archive
  - Installing psr/http-client (1.0.3): Extracting archive
  - Installing composer/semver (3.4.2): Extracting archive
  - Installing swow/swow (v1.5.3): Extracting archive
> support\Plugin::install
> support\Plugin::install
> support\Plugin::install
> support\Plugin::install
> support\Plugin::install
1 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
12 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.5 for swow/swow

然后运行 vendor/bin 目录下的自动安装器 swow-builder 即可开始安装:

代码语言:javascript
复制
./vendor/bin/swow-builder

安装日志

代码语言:javascript
复制
# ./vendor/bin/swow-builder
> cd /var/www/webman2024/vendor/swow/swow/ext && \
phpize && \
./configure 
Configuring for:
PHP Api Version:         20230831
Zend Module Api No:      20230831
Zend Extension Api No:   420230831
...
Directive => Local Value => Master Value
swow.enable => On => On
swow.async_threads => 0 => 0
swow.async_file => On => On
swow.async_tty => On => On

👀 Do you want to install it right now? (Y/n): Y
> cd /var/www/webman2024/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 🚀🚀🚀

出现以上结果,恭喜你安装成功啦!!!

开启swow事件驱动

webman框架中开启swow事件驱动特别简单,只有配置一下就可以了。

修改配置文件config/server.php服务配置文件

代码语言:javascript
复制
return [
    'listen'           => 'http://0.0.0.0:8787',
    'transport'        => 'tcp',
    'context'          => [],
    'name'             => 'webman',
    'count'            => cpu_count() * 10,
    'user'             => '',
    'group'            => '',
    'reusePort'        => false,
    'event_loop'       => \Workerman\Events\Swow::class,
    'stop_timeout'     => 2,
    'pid_file'         => runtime_path() . '/webman.pid',
    'status_file'      => runtime_path() . '/webman.status',
    'stdout_file'      => runtime_path() . '/logs/stdout.log',
    'log_file'         => runtime_path() . '/logs/workerman.log',
    'max_package_size' => 10 * 1024 * 1024
];

启动webman,查看事件驱动是否已经是swow事件驱动。使用以下命令启动

代码语言:javascript
复制
php -d extension=swow webman start

终端展示

代码语言:javascript
复制
/var/www/webman2024 # php -d extension=swow webman start
Workerman[webman] start in USER mode
-------------------------------------------------- WORKERMAN --------------------------------------------------
Workerman version:5.0.0-beta.7    PHP version:8.3.9     Event-loop:Workerman\Events\Swow
--------------------------------------------------- WORKERS ---------------------------------------------------
proto   user            worker                       listen                      processes    state            
tcp     root            webman                       http://0.0.0.0:8217         8             [OK]            
tcp     root            monitor                      none                        1             [OK]            
tcp     root            push_chart                   none                        1             [OK]            
tcp     root            plugin.webman.push.server    websocket://0.0.0.0:8788    1             [OK]            
---------------------------------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.

查看运行状态php start.php status

协程

协程,英文Coroutines,是一种比线程更加轻量级的存在。最重要的是,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)

代码语言:javascript
复制
<?php
/**
 * @desc swow.php 描述信息
 * @author Tinywan(ShaoBo Wan)
 */
declare(strict_types=1);
use Exception;
use Swow\Coroutine;

$coroutine = Coroutine::run(static function (): void {
    while (true) {
        try {
            // output: int(999)
            var_dump(sleep(999));
        } catch (\Exception) {
            // skip
        }
    }
});
$coroutine->resume(); // resume the coroutine to cancel the sleep
$coroutine->throw(new Exception()); // throw exception to the coroutine
$coroutine->kill(); // kill the coroutine (just like SIGKILL)

debug模式

代码语言:javascript
复制
\Swow\Coroutine::run(static function (): void {
    (static function (): void {
        (static function (): void {
            var_dump(\Swow\Coroutine::getCurrent());
        })();
    })();
});

执行输出

代码语言:javascript
复制
/var/www/webman2024/app/controller/indexController.php:29:
class Swow\Coroutine#243 (5) {
  public $id =>
  int(13)
  public $state =>
  string(7) "running"
  public $switches =>
  int(0)
  public $elapsed =>
  string(3) "0ms"
  public $trace =>
  string(1252) "
#0 [internal function]: Swow\Coroutine->__debugInfo()
#1 /var/www/webman2024/app/controller/indexController.php(29): var_dump(Object(Swow\Coroutine))
#2 /var/www/webman2024/app/controller/indexController.php(30): app\controller\IndexController::app\controller\{closure}()
#3 /var/www/webman2024/app/controller/indexController.php(31): app\controller\IndexController::app\controller\{closure}()
#4 [internal function]: app\controller\IndexController::app\controller\{closure}()
#5 /var/www/webman2024/app/control"...
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Swow 是什么?
  • 安装
    • 安装workerman 5.0
      • 安装swow拓展
      • 开启swow事件驱动
      • 协程
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档