PHP建立MySQL与MySQLi持久化连接(长连接)区别

张开发
2026/4/9 8:58:34 15 分钟阅读

分享文章

PHP建立MySQL与MySQLi持久化连接(长连接)区别
在PHP开发中与数据库的交互是非常常见的操作。MySQL是一种流行的关系型数据库而PHP为其提供了两种不同的API即MySQL和MySQLi。在使用这两个API时我们可以选择使用持久连接或非持久连接。MySQL的持久连接需使用mysql_pconnect而MySQLi持久连接默认启用。尽管MySQLi有性能和安全优势但使用持久连接时应注意服务器连接限制和资源占用问题。php-mysql的持久连接只在同一个进程里可“复用”不同进程之间玩不了。fpm的子进程可以常驻所以只要子进程还在那么上一次请求创建的持久连接下一次请求还可以复用。cli每次都新起一个进程没法把连接复用那么短连接和持久连接其实是一样的。如果在 PHP 5.3 的版本以前想要创建MySQL的持久化连接(长连接)需要显式调用 pconnect 创建12345678$con mysql_pconnect($server[host],$server[username],$server[password]);if(!($con false)) {if(mysql_select_db($server[database],$con) false) {echo(Could not select database: . mysql_error());continue;}// do something here……}从 PHP 5.3 开始 mysqli 扩展开始支持持久化连接持久化连接已经在 PDO MYSQL 和 ext/mysql 中提供支持。持久化连接的优势持久化连接的目的在于重用客户端到服务器之间的连接 而不是每次在需要的时候都重新建立一个连接。由于持久化连接可以将已经建立的连接缓存起来以备后续的使用 所以省去了建立新的连接的开销 因此可以带来性能上的提升。不像 mysql 扩展mysqli 没有提供一个特殊的方法用于打开持久化连接。 如果 mysqli 打开一个持久化连接需要在创建连接时在host前面增加p:两个字符。mysql 和 mysqli 扩展的区别如下持久链接建立方式mysqli是在host前面增加“p:”两个字符mysql使用mysql_pconnect函数mysqli 建立的持久链接必须在mysqli_close之后才能被下一个请求复用mysql的长连接可以立即被复用pdo 建立的持久链接不必关闭就能复用mysqli 建立持久链接时会自动清理上一个会话变量、回滚事务、解锁表、释放锁等操作而 mysql 扩展则不会这点非常重要mysqli 判断是否为同一持久链接标识是 IPPORT、USER、PASS、DBNAME、SOCKETmysql 是 IP、PORT、USER、PASS、CLIENT_FLAGS持久化长连接的风险使用持久化连接也会存在一些风险 因为在缓存中的连接可能处于一种不可预测的状态。例如如果客户端未能正常关闭连接 可能在这个连接上残留了对库表的锁 那么当这个连接被其他请求重用的时候这个连接还是处于 有锁的状态。所以如果要很好的使用持久化连接那么要求代码在和数据库进行交互的时候 确保做好清理工作保证被缓存的连接是一个干净的没有残留的状态。mysqli 扩展的持久化连接提供了内建的清理处理代码。 mysqli 所做的清理工作包括回滚处于活动状态的事务关闭并且删除临时表对表解锁重置会话变量关闭预编译 SQL 语句在PHP中经常发生关闭处理程序释放通过 GET_LOCK() 获得的锁这确保了将连接返回到连接池的时候 它处于一种“干净”的状态可以被其他客户端进程所使用。mysqli 扩展 通过自动调用 C-API 函数 mysql_change_user() 来完成这个清理工作。自动清理的特性有优点也有缺点优点是程序员不再需要担心附加的清理代码 因为它们会自动调用。然而缺点就是 性能 可能会 慢一点 因为每次从连接池返回一个连接都需要执行这些清理代码。这个自动清理的代码可以通过在编译 php 时定义MYSQLI_NO_CHANGE_USER_ON_PCONNECT来关闭。注意: mysqli 扩展在使用 MySQL Native Driver 或 Mysql Client Librarylibmysql时都支持持久化连接。为什么我的长连接不生效村长多说两句相信很多小伙伴遇到过这个问题明明创建了 pconnectshow process_list 查看数据库链接却发现长连接没有被复用而是重新创建了一个这是为啥呢这得从PHP的运作模式说起。一般 php 有2种运行模式, 一是作为 cgi 运行, 二是作为 apache 的模块运行作为 cgi 的时候 connect 跟 pconnect 没什么不同, 因为每次 cgi 进行运行结束后都会被销毁清理掉资源php 作为 apache 模块方式运行时, 可以使用到数据库持续连接, 但可能会存在潜在的问题说白了如果你是 cgi 运行方式pconnection 永远也不会生效。长连接最大的缺点就是万一一个用户锁死当前进程就永久锁死了假如你在apache里的设置是进程永不销毁的话就…总之尽量使用 mysql_connect因为运行结束后会自动断开再说了现在的机器性能都不差不至于缺少那点儿创建销毁带来的内存开销。到此这篇关于PHP建立MySQL与MySQLi持久化连接(长连接)区别的文章就介绍到这了

更多文章