windows中使用swow协程的错误(已解决)

luoyue

问题描述

在onWorkerStart中使用数据库连接池可能会堆栈异常。

程序代码

启用swow协程。在程序启动后连接数据库。
静态php下载地址:
https://static-php-cli.fra1.digitaloceanspaces.com/static-php-cli/windows/spc-max/php-8.3.13-cli-win.zip

报错信息

  • 第一处错误
    Warning: [Fatal error in R5] Uncaught TypeError: stream_poll_one(): supplied resource is not a valid stream resource in E:\workerman\api-v3\vendor\workerman\workerman\src\Events\Swow.php:192
    Stack trace:
    #0 E:\workerman\api-v3\vendor\workerman\workerman\src\Events\Swow.php(192): stream_poll_one(Resource id #365, 18)
    #1 [internal function]: Workerman\Events\Swow->Workerman\Events\{closure}()
    #2 {main}
  • 第二处错误
    Warning: [Fatal error in scheduler] Uncaught Error: Maximum call stack size of 212992 bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion? in E:\workerman\api-v3\vendor\workerman\coroutine\src\Utils\DestructionWatcher.php:48
    Stack trace:
    #0 [internal function]: Workerman\Coroutine\Utils\DestructionWatcher->__destruct()
    #1 {main}
    thrown in E:\workerman\api-v3\vendor\workerman\coroutine\src\Utils\DestructionWatcher.php on line 48

截图报错信息里报错文件相关代码

  • 第一处错误并不是代码问题,我发现workerman仓库中的src\Events\Swow.php和我的不一致导致的。
    我对比了版本号并重新使用composer安装依然存在这个问题,我不清楚是不是composer的bug。
    我的代码:
    截图

  • 第二处错误经过分析最终引发的异常为上下文未正确销毁引发的无限递归调用。
    原因是我在bootstrap中使用了数据库连接,在workerman中onWorkerStart开了一个协程处理,但是没有销毁上下文。所以才导致了这个bug。
    修复代码如下:
    截图

操作系统及workerman/webman等框架组件具体版本

windows 10
workerman: 5.1
webman: 2.1
webman/database:2.1.6
webman/redis: 2.1.3

374 1 1
1个回答

胡桃

Swow 一年没更新了,可以放弃了

🔝