php mysql 实现并发
实现 PHP 与 MySQL 并发操作
PHP 与 MySQL 的并发操作可以通过多种方式实现,包括连接池、异步查询、多线程等。以下是几种常见的方法:
使用持久连接(Persistent Connection)
持久连接可以在多个请求之间复用数据库连接,减少连接建立和关闭的开销。在 PHP 中,可以通过 mysql_pconnect 或 PDO 的 ATTR_PERSISTENT 属性实现。
$dbh = new PDO(
'mysql:host=localhost;dbname=test',
'username',
'password',
array(PDO::ATTR_PERSISTENT => true)
);
使用连接池
连接池管理一组数据库连接,应用程序可以从池中获取连接,使用完毕后归还。PHP 本身不直接支持连接池,但可以通过扩展如 Swoole 或外部工具如 ProxySQL 实现。

// 使用 Swoole 的连接池示例
$pool = new Swoole\ConnectionPool(
function () {
return new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
},
10 // 池大小
);
异步查询
异步查询允许在等待数据库响应时执行其他任务。MySQLi 和 PDO 不直接支持异步查询,但可以通过 Swoole 或 ReactPHP 实现。
// 使用 Swoole 的 MySQL 协程客户端
$mysql = new Swoole\Coroutine\MySQL();
$mysql->connect([
'host' => 'localhost',
'user' => 'user',
'password' => 'pass',
'database' => 'test',
]);
$result = $mysql->query('SELECT * FROM users');
多进程与多线程
PHP 原生支持多进程(如 pcntl_fork),但不支持多线程。可以通过扩展如 pthreads 或多进程实现并发。

// 多进程示例
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} elseif ($pid) {
// 父进程
pcntl_wait($status);
} else {
// 子进程
$dbh = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $dbh->query('SELECT * FROM users');
exit();
}
使用队列系统
将数据库操作放入队列(如 Redis、RabbitMQ),由后台 worker 进程异步处理,减轻数据库压力。
// 使用 Redis 队列示例
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->lPush('db_queue', json_encode(['query' => 'SELECT * FROM users']));
优化数据库配置
调整 MySQL 配置以支持更高并发,如增加 max_connections、优化 innodb_thread_concurrency 等。
# MySQL 配置示例
max_connections = 200
innodb_thread_concurrency = 8
使用事务与锁
合理使用事务和锁(如 SELECT FOR UPDATE)避免并发导致的数据不一致。
$dbh->beginTransaction();
$stmt = $dbh->prepare('SELECT * FROM users WHERE id = ? FOR UPDATE');
$stmt->execute([1]);
$dbh->commit();
总结
实现 PHP 与 MySQL 的并发需要结合多种技术,包括连接池、异步查询、多进程、队列等。根据具体场景选择合适的方法,并优化数据库配置以提高并发性能。






