代码 — 一个带连接池的 PDO,3 个协程
// 一个 PDO 对象,连接池大小为 2
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_POOL_ENABLED => true,
PDO::ATTR_POOL_MAX => 2,
]);
for ($i = 1; $i <= 3; $i++) {
spawn(function() use ($pdo, $i) {
// prepare() 自动从连接池获取连接
$stmt = $pdo->prepare("SELECT * FROM users WHERE id=?");
$stmt->execute([$i]); // 等待数据库响应
$user = $stmt->fetch();
processUser($user);
// $stmt 离开作用域 -> refcount=0
// 连接自动归还连接池!
});
}
PDO Pool (ATTR_POOL_MAX: 2)
连接 #1
空闲
连接 #2
空闲
等待队列:
空
协程 1
就绪
协程 2
就绪
协程 3
就绪