Heim > Fragen und Antworten > Hauptteil
一个脚本里面有连接mysql的sql语句,执行的时候mysql服务器是新开一个线程(还是进程?)是处理这个连接,脚本结束后就断开与PHP(还是apache?)的连接了吗。那些什么mysql长连接又是回事呢?突然觉得啥都不懂了。。。
漂亮男人2017-05-16 13:08:27
1.mysql开启进程处理相应事务
2.断开与apache httpd进程的连接,php以apache mod方式运行,apache接受到请求,将请求转发给mod,mod调取php
sapi执行,整个过程php以apache模块方式执行,在httpd进程中
3.短链接的缺点:创建一个连接,程序执行完毕后,就会自动断掉与mysql的链接。于是多少次php执行,就会多少次这样的创建和释放过程。频繁地创建和释放连接,比较耗费cpu资源。
长连接就可以避免每次请求都创建连接的开销,节省了时间和IO消耗。
mysql发现一个链接长时间没有执行查询请求,就会自动断掉这个连接
大家讲道理2017-05-16 13:08:27
单从php来说不可以维持长连接,但是有方法实现的。
如果是Apache+php_module模式去跑php,通过mysql_pconnect就可以建立永久链接,不过这个链接是由Apache去维持的(mysql_pconnect在nginx+fpm下不能维持长连接的,官方文档有说明)
nginx+fpm fpm一般设置为static,通过PDO扩展,连接数据库时可设置长连接,由每个fpm维持一个永久链接。不过还是要根据系统去评估一下fpm进程数和数据库最大连接数,php请求过少的话,大量连接闲置状态浪费资源(需合理配置mysql wait_time),php请求过多,fpm进程数过多导致超过数据库最大连接数就会造成too many connections。。
天蓬老师2017-05-16 13:08:27
一般php每次执行sql都会建立一个短链接,当执行完毕后由php断开链接(也许超时那么将有MySQL来断开链接)
现在有种通用的减少这种IO开销的方式是建立数据库连接池,维护指定数量的连接,用的时候直接获取相关资源就可以。