<?php
        mysql_pconnect('192.168.75.128', 'root', 'root');
        mysql_close();
        sleep(10);
        echo 'pconnect';

命令行访问时

[root@LocalWeb01 baidu91]# php mysql.php

查看mysql进程的线程的情况

show processlist

15 | root | 192.168.75.128:43457 | NULL | Sleep   |     9 |       | NULL    

超过10秒钟,线程号没有了,为什么长连接没有起作用了,因为php进程结束后,释放所有资源

可以查看php进程

10秒后

可以发现

进程号没有了

php的线程数量可以通过 /usr/local/php/etc/php-fpm.conf  max-chlidren修改,

浏览器访问时

确实有长连接,

可以做个实验,把php进程杀掉,在查看mysql线程情况,如下图

使用pconnect时, 有请求连接mysql时, php会检查是否之前有条相同的连接(以相同的用户名密码连接到同一个mysql服务器)已经建立, 如果有的话就直接使用这条连接

假设mysql服务器被配置为最大支持10个并发. 而nginx被配置为使用100个子进程.

nginx由一个父进程来协调将收到的http request分发给哪个空闲中的子进程处理,  这样很快处理了10个http请求, 假设10个都分配给了不同的子进程, 那末10条跟mysql间的持久连接就建立了, mysql的能力已经到了极限.

这时又来了一个http请求, nginx将它分给其他的任意不在这10个子进程中的进程, 那末这个进程就没有办法建立到mysql的连接了, 因为坑位已经满了.

 

使用持久连接还会有其他方面的问题.

如 果在你脚本中使用了持久连接, 又进行了锁表操作的话,  如果到脚本结束也没有去解锁的话.  那么下次再运行这个脚本的话, 它为了获得lock table会在那里无尽地等待过去的它unlock table, 过去的它已经不能回来了, 这里成了个死循环. 除非重启web或者mysql服务器. 另一个会造成锁定的就是事务了