Swoole中异步MySQL查询需启用mysqlnd扩展,使用Swoole\Coroutine\MySQL在协程内connect()和query(),支持单连接并发query、错误通过errno判断、结果为空时返回空数组。

在Swoole中实现异步MySQL查询,能避免协程阻塞、提升高并发场景下的数据库响应效率,尤其适用于API接口中需同时查多个表或调用多个DB操作的业务逻辑。
准备异步MySQL连接环境
确认已安装 Swoole 5.0+(含 mysqlnd 支持)和 php-mysqlnd 扩展;若使用 Docker,需在 php.ini 中启用 extension=swoole 且确保 mysqlnd 已加载——缺少 mysqlnd 会导致 Swoole\Coroutine\MySQL 初始化失败并静默返回 false。
运行 php --ri swoole 查看输出中是否包含 mysqlnd => enabled,否则需重新编译 PHP 或切换镜像源。
这一步不可跳过,【未启用 mysqlnd 时 new Swoole\Coroutine\MySQL() 总是返回 null】。
编写基础异步查询代码
方法一:使用 Swoole 内置协程 MySQL 客户端
第一步:创建连接对象 → 调用 connect() 方法传入配置数组 → 检查返回值是否为 true。
第二步:执行 query() 发送 SQL → 返回结果为关联数组或 false;若 SQL 有语法错误,不会抛异常而是返回 false 并设置 $mysql->errno 属性。
第三步:用 var_dump($mysql->affected_rows) 查看影响行数,用 $mysql->insert_id 获取自增 ID——这两项在 query() 后立即可用,无需额外调用。
注意:connect() 和 query() 都是协程挂起点,必须在协程环境中运行(如 Swoole\Http\Server 的 onRequest 回调内),直接在 CLI 同步脚本里调用会退化为同步行为。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
并发执行多条查询
方法一:用 go() + 协程闭包并发查三张表
定义三个匿名函数,每个函数内部独立 new Swoole\Coroutine\MySQL() → connect() → query();全部用 go() 包裹后,它们将并行发起连接与查询请求。
方法二:复用单个连接对象(更推荐)
先 new 一次连接对象,在主协程中 connect() 成功后,用 array_map + go() 向同一连接并发发送不同 SQL;Swoole 底层会自动排队并行处理这些 query 请求,但要注意:MySQL 协议本身不支持真正意义上的“连接内并行查询”,实际是串行发包+协程调度隐藏延迟,效果仍优于同步逐条执行。
这一步的关键是别在每个 go() 里重复 new 连接——频繁建连会触发 TCP TIME_WAIT 堆积,【单个连接对象可安全被多个协程并发调用 query()】。
处理查询结果与错误
每次 query() 后立刻检查 $mysql->errno:等于 0 表示成功,非 0 则读取 $mysql->error 获取报错信息;不要依赖 try-catch,因为底层不抛出 Exception。
查询结果为二维数组,键名默认为字段名小写(除非 setOption(SWOOLE_MYSQL_OPTION_CASE_LOWER, false));若需数字索引,需手动 array_values() 处理。
如果查询返回空结果集(比如 WHERE 条件不匹配),query() 仍返回 [] 数组而非 null,判断空应使用 empty($result) 而非 === null。










