在webman中使用swoole一键协程化不生效
//webman server.php 配置
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\Swoole::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
];
// 测试一键协程化
\Swoole\Runtime::enableCoroutine(SWOOLE_HOOK_ALL);
go(function () {
Db::select("select CONNECTION_ID(),SLEEP(30);");
});
mysql:
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. (SQL: select CONNECTION_ID(),SLEEP(30);)
redis:
Uncaught Swoole\Error:
Socket#12 has already been bound to another coroutine#25, reading of the same socket in coroutine#29 at t
he same time is not allowed in
webman版本1.4.7
swoole版本5.0.2
php版本8.1
操作系统:centos7
用 Channel 实现连接池。
参考:https://gitee.com/mix-php/mix/tree/master/src/object-pool
有人问过这种问题:https://www.workerman.net/q/10007
感谢你的回答!不过使用连接池并不是我想要达到的目的
这个报错说明一键协程已经生效了。
报错的意思是数据库连接不能同时被多个协程使用,要么每个协程一个数据库连接,要么使用连接池机制。
协程不是所有composer库都支持,你要用协程就必须改造所有的第三方composer库,保证这些库互斥使用某些资源,保证不会全局变量污染等等。
感谢你的回答!按swoole官网的文档,一键协程化【https://wiki.swoole.com/#/runtime】 说明,我以为可以不需要使用相关连接池。。。
如果是如你所说的话,那我就必须要用连接池了,不然每个协程内都实例化一个新的连接出来,那连接数很快就会打满