做php不到一个月,有了关于这个的疑问。之前写代码,总是用的mysql_connect,用完之后,用Mysql_close关闭产生的链接。一直也没什么问题。慢慢的,知道了mysql_pconnct,这个长连接。然后做了点不算测试的小测试(实在太小了)早上开机(办公室电脑,不是服务器),直接打开mysql的命令行,命令列出show processlist;
mysql> show processlist;
+----+------+----------------+------+---------+------+-------+------------------+
| Id | User | Host           | db   | Command | Time | State | Info             |
+----+------+----------------+------+---------+------+-------+------------------+
| 1 | root | localhost:2396 | NULL | Query   |    0 | NULL  | show processlist |
+----+------+----------------+------+---------+------+-------+------------------+
2 rows in set (0.00 sec)
然后打开php,写下代码$con = mysql_connect("localhost:3333","root","root");
echo $con;
echo "<br>";
echo MySQL_thread_id($con);
mysql_close($con);
echo "<br>";
echo getmypid();
[code]结果是:
Resource id #3
5
1668其中的5随着页面刷新不停的顺序变大,其它值不变,期间命令行中不停地show processlist;但是结果没有变。后来把mysql_connect改成mysql_pconnect,然后不停的刷新页面,
页面上的三个值都不在改变。命令行中结果了变成了
[code=sql]
mysql> show processlist;
+----+------+----------------+------+---------+------+-------+------------------+
| Id | User | Host           | db   | Command | Time | State | Info             |
+----+------+----------------+------+---------+------+-------+------------------+
| 67 | root | localhost:2396 | NULL | Query   |    0 | NULL  | show processlist |
| 68 | root | localhost:2402 | NULL | Sleep   |   29 |       | NULL             |
+----+------+----------------+------+---------+------+-------+------------------
+
2 rows in set (0.00 sec)
但是长时间不动,一刷新,就会出问题,出错如下:
命令行下,也会出错:
mysql> show processlist;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    74
Current database: *** NONE ***目前,我有几个问题:
1.是不是打开长连接后,只要这个连接存在,不同的客户端都可以调用?还是只能是打开这个连接的客户端(ip)调用?
2.为什么用长连接会出错呢。出这种连接丢失的问题。还有,这个连接时长,我居然在my.ini里找不到设置。纠结
3.大家一般用长连接还是短连接。
还有的问题忘了。嘿嘿。ps:分数输入200后,居然提示:
创建失败
给分 必须大于20小于100 

解决方案 »

  1.   

    长连接不可以显式的关闭
    长连接只保存了到数据库服务器的物理链路(tvp/ip),并未保存导读句酷的连接
    长连接空闲后到可被其他长连接利用,有一个延时时间。可在my.ini中设置
    无可再利用的插连接时,将创建新的链路
    除非两端有一端重启,否则已有的链路不会被断开(不管是否有用)
      

  2.   

    不得不说一下连接池这个东西了
    asp有连接池,.net有,jsp也有,唯独php没有这个东西
    因为php链接mysql的速度实在是太快了,我曾自己做过测试比较过,所以他根本就不需要建立连接池来浪费这部分内存.我曾针对这个问题研究过好长时间,甚至自己把建立链接之后的object串行化,使用的时候再次反串,但是反串之后的结果只是一个没有意义的object罢了,因为必须要配合__wakeup这个魔术方法再次连接数据库才行.怎么说呢,PHP其实是根本没必要存在长连接这个东西的.
    如果你一定要用pconn...的话还要对ini文件做一些设定,不过不太鼓励这么做,我曾研究过很多大型的系统,大家如出一辙几乎都没有人在使用pconn...的