错误信息: XXXX client has already been bound to another coroutine

使用协程客户端时出现以下错误信息:

  1. redis client has already been bound to another coroutine.

这表示在两个协程内使用了同一个客户端。请修改PHP代码,避免出现此情况。

错误实例

  1. $redis = new Co\Redis;
  2. go(function () use ($redis) {
  3. $redis->get("key");
  4. });
  5. go(function () use ($redis) {
  6. $redis->get("key");
  7. });

例子中两个协程同时使用$redis->get进行IO操作,会引起混乱。底层在第二个协程调用$redis->get时会抛出上述致命错误。

解决方案

使用Swoole\Coroutine\ChannelSplQueue实现连接池,管理协程客户端资源。一个客户端对象仅用于一个协程,操作完毕后,再释放给其他协程使用。