在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。
修复代码如下:
windows 10
workerman: 5.1
webman: 2.1
webman/database:2.1.6
webman/redis: 2.1.3
Swow 一年没更新了,可以放弃了
解决了,已提交pr