百分请教思路:php mysql连接过多

小雨转晴 2010-09-14 10:56:22
mysql_connect()

由于系统的复杂性,对于数据库的连接过多,甚至造成数据库崩溃。

查了好多资料php似乎没有连接池的概念。

那么是否有什么机制可以控制mysql的连接个数、等待、空闲、分配、释放等呢?

高手指点。
...全文
749 54 打赏 收藏 转发到动态 举报
写回复
用AI写文章
54 条回复
切换为时间正序
请发表友善的回复…
发表回复
小雨转晴 2010-09-20
  • 打赏
  • 举报
回复
如果不是要解决这个问题,我还一直认为在每个方法里面关闭连接是正确的,貌似是受了java的影响。

优化中。。。
小雨转晴 2010-09-19
  • 打赏
  • 举报
回复
php 还可以打打断点????快请指点一下!!我一直是EditPlus
小雨转晴 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 maquan 的回复:]

引用 45 楼 wind_324 的回复:
为何您说“不指定 new_link 的话,的确每次得到的是同一个连接,而且,对于这种连接使用 mysql_close() 完全是形同虚设”。我不清楚您判断是否为同一个连接的依据是什么,还请指教!
我是用 var_dump($link) 查看的,里面的 resource id 应该能用来分辨出是否同一个“对象”。另外,还可以在 PHP 里设断点单步执……
[/Quote]
如果不指定 new_link 的话,得到连接后,即使调用了 mysql_close(),后面继续使用这个 $link 访问数据库都一切正常

不会吧???我调用my_close()确实返回1啊!那这样说来这个方法不是毫无意义可言?
maquan 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 wind_324 的回复:]
为何您说“不指定 new_link 的话,的确每次得到的是同一个连接,而且,对于这种连接使用 mysql_close() 完全是形同虚设”。我不清楚您判断是否为同一个连接的依据是什么,还请指教![/Quote]
我是用 var_dump($link) 查看的,里面的 resource id 应该能用来分辨出是否同一个“对象”。另外,还可以在 PHP 里设断点单步执行,同时通过数据库工具从数据库里面查看连接个数,也能判断出来是否产生了“新连接”。

如果不指定 new_link 的话,得到连接后,即使调用了 mysql_close(),后面继续使用这个 $link 访问数据库都一切正常。

■□■□■□■□■□■□■□■
□             □
■  忍以明志 勤以致远  ■
□             □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
小雨转晴 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 44 楼 maquan 的回复:]

引用 41 楼 helloyou0 的回复:
这个一定是同一个连接,不要说你有那个global和if,就算没有, php在同样主机和用户的情况下,也会自动用上一个. mysql_connect有第4个参数new_link, 如果设为true,才会创建不同连接
强啊,想不到 mysql_connect 还有这层机关!

刚试了一下,不指定 new_link 的话,的确每次得到的是同一个连接……
[/Quote]

maquan:

我也刚发现这个参数。php手册上说:
“一旦脚本结束,到服务器的连接就会被关闭。除非之前已经调用了 mysql_close() 来关闭它。”
为何您说“不指定 new_link 的话,的确每次得到的是同一个连接,而且,对于这种连接使用 mysql_close() 完全是形同虚设”。我不清楚您判断是否为同一个连接的依据是什么,还请指教!
Inpool 2010-09-19
  • 打赏
  • 举报
回复
mysql_close()是不会关闭mysql_pconnnect()打开的连接的。

你这个问题应该在进入循环前把所有的connection关闭,然后再进去,确保同一时刻只打开了一个connection
小雨转晴 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 51 楼 maquan 的回复:]

引用 47 楼 wind_324 的回复:
如果不指定 new_link 的话,得到连接后,即使调用了 mysql_close(),后面继续使用这个 $link 访问数据库都一切正常
不会吧???我调用my_close()确实返回1啊!那这样说来这个方法不是毫无意义可言?
我试验的结果是这样的,你也可以试试看。

其实也不难理解,并不是“毫无意义可言”,它只是对于 new_link=f……
[/Quote]

恩 是这个理,我想我找到优化方案了,我回去测试,有好消息通知各位然后回来揭帖。呵呵 感谢大家了
maquan 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 wind_324 的回复:]
如果不指定 new_link 的话,得到连接后,即使调用了 mysql_close(),后面继续使用这个 $link 访问数据库都一切正常
不会吧???我调用my_close()确实返回1啊!那这样说来这个方法不是毫无意义可言?[/Quote]
我试验的结果是这样的,你也可以试试看。

其实也不难理解,并不是“毫无意义可言”,它只是对于 new_link=false 的情况是这样处理的。既然你使用了 new_link=false,那么得到的连接就不能保证是你新建立的,很可能是别的地方已经建立的,你这里只是拿来“借用”而已,那当然你也不能真的把它关闭掉,因为很可能别的地方还要用它。反正等 request 处理完毕后,总归是会关闭的。

■□■□■□■□■□■□■□■
□             □
■  忍以明志 勤以致远  ■
□             □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
cslgpl 2010-09-19
  • 打赏
  • 举报
回复

慢慢学习,菜鸟也能变老鸟
maquan 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 wind_324 的回复:]
php 还可以打打断点????快请指点一下!!我一直是EditPlus
[/Quote]
支持 PHP 开发的集成环境很多啊,我喜欢 Eclipse 的,你可以看看这个:
Eclipse for PHP Developers

■□■□■□■□■□■□■□■
□             □
■  忍以明志 勤以致远  ■
□             □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
helloyou0 2010-09-18
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 wind_324 的回复:]

我现在有些不明白 是不是一个理论上php针对一个线程创建一个连接?
( 如果new_link!=true 且是同一个主机和用户 )

当这个线程执行完连接自动关闭?
( 如果没有用pconnect )

如果紧接着还有线程用连接,所new新的还是用的上一个呢?
( 如果用了pconnect )

[/Quote]

..
maquan 2010-09-18
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 helloyou0 的回复:]
这个一定是同一个连接,不要说你有那个global和if,就算没有, php在同样主机和用户的情况下,也会自动用上一个. mysql_connect有第4个参数new_link, 如果设为true,才会创建不同连接[/Quote]
强啊,想不到 mysql_connect 还有这层机关!

刚试了一下,不指定 new_link 的话,的确每次得到的是同一个连接,而且,对于这种连接使用 mysql_close() 完全是形同虚设。

这样的话,回顾楼主所遇到的问题,就不应该存在“循环”导致“连接过多”的问题了呀?!(难道楼主最初的程序是 new_link=true 的?)

■□■□■□■□■□■□■□■
□             □
■  忍以明志 勤以致远  ■
□             □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
helloyou0 2010-09-17
  • 打赏
  • 举报
回复
if(!isset($G_db)||empty($G_db)){
$this->link = mysql_connect ( $this->hostname, $this->dbuser, $this->dbpass );


这个一定是同一个连接,不要说你有那个global和if,就算没有, php在同样主机和用户的情况下,也会自动用上一个. mysql_connect有第4个参数new_link, 如果设为true,才会创建不同连接
小雨转晴 2010-09-17
  • 打赏
  • 举报
回复
我现在有些不明白 是不是一个理论上php针对一个线程创建一个连接?当这个线程执行完连接自动关闭?

如果紧接着还有线程用连接,所new新的还是用的上一个呢?
lheilang 2010-09-16
  • 打赏
  • 举报
回复
看看也是好的,受益匪浅。。
小雨转晴 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 maquan 的回复:]

引用 25 楼 wind_324 的回复:
我想过这样作,如果这样话,n多的线程都在等上面使用的连接。效率上肯定特别的慢啊。
应该没有你担心的这个问题。

你的“循环”肯定是在一个 request 的处理过程中,而处理一个 request 肯定是在一个线程里完成的(当然更是一个进程),不存在跨线程等待的问题。

你通过改造 class DB 的方式实现的“共用同一个连接”,只能是在“……
[/Quote]
是这个道理,我着手测试中。。敬请期待。。。。呵呵。。。感谢各位呢。
小雨转晴 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 coolesting 的回复:]

引用 29 楼 wind_324 的回复:

引用 28 楼 helloyou0 的回复:

引用 19 楼 wind_324 的回复:

没有用pconnect 觉得会占用的更多 不被释放




恩 我也在考虑程序优化的问题。逻辑有些复杂 暂时还不是太明白。

但是会不会是mysql本身的问题呢?比如上一个连接没执行完,下一个来了,还没释放呢。。一次类推,越来越多。……
[/Quote]
我打算用global 测试一下 看看效果。如果不行其次还得抠程序,必须看出个端倪来。
如果再没有问题,就是mysql出问题了或是硬件抗不住了
骄傲青蛙 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 wind_324 的回复:]

引用 28 楼 helloyou0 的回复:

引用 19 楼 wind_324 的回复:

没有用pconnect 觉得会占用的更多 不被释放




恩 我也在考虑程序优化的问题。逻辑有些复杂 暂时还不是太明白。

但是会不会是mysql本身的问题呢?比如上一个连接没执行完,下一个来了,还没释放呢。。一次类推,越来越多。。。。
[/Quote]

有这样的情况, 关键还在于代码怎么写, 其次的配置, 再者就是硬件到达瓶颈了.
小雨转晴 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 helloyou0 的回复:]

引用 19 楼 wind_324 的回复:

没有用pconnect 觉得会占用的更多 不被释放




使用pconnect是要小心的,很多情况会造成悬挂连接,可以看看手册上的部分(包括下面的注释)
http://php.net/manual/en/function.mysql-pconnect.php

而connect不会有这个问题,考虑到你的问题是连接数过多,所以如……
[/Quote]

恩 我也在考虑程序优化的问题。逻辑有些复杂 暂时还不是太明白。

但是会不会是mysql本身的问题呢?比如上一个连接没执行完,下一个来了,还没释放呢。。一次类推,越来越多。。。。
fxs_2008 2010-09-16
  • 打赏
  • 举报
回复
另外,如果PHP启动一个连接,没有关闭,也没有重新声明新联接,也没重选数据库
则下次查询时会自动用上次的连接
加载更多回复(34)

4,251

社区成员

发帖
与我相关
我的任务
社区描述
国内外优秀PHP框架讨论学习
社区管理员
  • Framework
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧