php+mysql 问题 百度一个星期 竟无人解决

我讨厌写代码 2010-07-29 07:14:33
Warning: mysql_pconnect() [function.mysql-pconnect]: Can't connect to MySQL server on 'localhost' (10055)

Warning: mysql_select_db() [function.mysql-select-db]: Can't connect to MySQL server on 'localhost' (10055)

Warning: mysql_select_db() [function.mysql-select-db]: A link to the server could not be established

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in

网站每隔4-6小时 就出现上述 提示,重启mysql 失败,必须重启服务器,重启后正常。

环境:系统2003 Apache-20+MySQL-5.0.77+PHP-5.2.9-2 IIS 只开了一个FTP

已设置注册表 TcpTimedWaitDelay 为30 已设置mysql的my.ini key_buffer = 128M

mysql_connect 也换成了 mysql_pconnect()

另有人说是 mysql临时文件夹满或C盘空间满,出问题的时候我看了 C盘只用了几百M,mysql临时文件夹找不到在哪

至今仍不能解决问题,以前PHP都是用的别人空间 不存在这问题,这次自己搞服务器出现了这个问题,热切希望有高手能够解决
...全文
533 点赞 收藏 34
写回复
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
骄傲青蛙 2010-08-04
把数据放进缓存,不用长连接,

要么启动个守护进程,开个长连接,
所有php子进程共用一个长连接进程。

以上建议纯属参考。。。
回复
jim8590251 2010-08-04
好像微软的更新 ...7732补订有问题,卸载掉就可以了,我之前遇到过和这个差不多问题
不知道LZ是不是这个问题!
回复
sagittaquas 2010-08-03
尤其是自动运行的定时任务等。
回复
sagittaquas 2010-08-03
还有看看你有没有很特别的,持续的任务。如果有,检查之。
回复
sagittaquas 2010-08-03
如果增加了不少虚拟内存,时间延长但问题仍然存在。又像你说的访问量不大。那么监控下相关进程,看看有没有什么东西在持续吃内存之类的情况。
回复
很郁闷找不到原因啊!常识了各种方法,今天重装个系统试试
回复
Yelup 2010-07-30
同感pconnect不适用,在消耗很大的情况下用pconnect是一种手段
但并不代表他适用所有情况。
回复
CunningBoy 2010-07-30
时间长了多久?和你加的虚拟内存成正比?
如果不是,估计还不是主要问题所在。
回复
昨天晚上增加了虚拟内存,好像支撑的时间稍微长了点
回复
其实个人觉得最有可能的还是服务器有问题,我用的是VPS,过俩天换个空间测试一下,找出答案与大家分享
回复
网站 并无 很大的访问量,新建的站还在测试,应该是除了少数几个人,没人访问的,即使是晚上没人操作睡一觉醒来,也会出同样的问题
回复
感谢大家支持,针对大家的回复我正在 逐一试验
回复
无笔秀才 2010-07-29
应该是Mysql的问题,用什么webserver都会这样。
回复
phpboy 2010-07-29
http://www.phprimer.com/viewtopic.php?f=2&p=1384#p1384

很好奇为什么PHP没有数据库连接池,就翻了下PHP中mysql模块的源码,发现mysql_pconnect使用zend引擎的函数 pemalloc()将数据库连接资源存在了全局内存中。这样看来,mysql_pconnect的效率应该很高,但是为什么很少有人用呢?

1.正常情况下当一个链接断开,你锁的表也会跟着解锁。但是长链接却永远不断开的,所以一个表万一一不小心锁了就一直锁着,除非你等着链接超时或者杀掉进程。同样的锁的问题也会在处理事务的时候发生。

2.正常情况下当一个链接断开,临时表也会被删除。但是由于长链接并不断开,临时表就变得不那么临时了。所以,临时表如果在完成业务后没有被删除,将会继续存在,提供给复用这个长链接的客户端使用。

3.如果PHP和mysql在同一台服务器上或者同一个局域网内,链接的时间是可以忽略不计的,所以用长链接不会得到任何益处。

4.Apache不能很好的处理长链接。当Apache接收到一个新的客户端的请求,它并不会使用一个已经拥有可用长链接的子进程,而是生成一个新的子进程,这个子进程会打开一个新的数据库连接。这就造成空闲的额外进程,资源的浪费,并且,当达到最大连接数时还会导致错误。得不偿失啊~

看看其他人怎么说的?

有一个哥们说:(这哥们是老外,我直接翻译了)

一般情况下,你是不会想用mysql_pconnect的。这个函数是为了连接数据库高开销的场景设计的。典型的Mysql / Apache / PHP 场景中,Apache会创建很多空闲的子进程来等待web请求。这里的每个子进程都会打开并维持一个独立的Mysql链接。所以,如果Mysql Server限制50个链接,而Apache有大于50个的子进程在跑,每个子进程都会建立一个独立的Mysql链接,哪怕他们是空闲的(空闲的 httpd子进程不跟其它进程共享Mysql链接)。因此,即使你只有很少几个需要链接数据库的页面跑在一个繁忙的站点上,也会很快用光连接数,而实际上并没有全部被利用上。

所以,用mysql_connect()链接Mysql吧,除非,每次建立连接都要花去大把的时间。



看看官方怎么说的:(地址:http://devzone.zend.com/node/view/id/686#fn1)

The mysql_pconnect() function was designed to provide a mechanism for reducing the cost of establishing and closing connections to the MySQL server. Unfortunately, due to an interaction between the architecture of the Apache server and the architecture of PHP, high traffic on a site that used pconnects could quickly clog up the MySQL server with many unused connections that could prevent many of the active connections from accessing the database.


翻译下:

mysql_pconnect()函数设计的目的是为了提供一种机制来减少与Mysql服务器建立/断开连接的开销。不幸的是,由于Apache服务器架构和PHP架构之间的相互作用,一个使用长链接的高流量的网站会因为很多没有使用的链接迅速堵塞Mysql服务器,并且导致活跃的链接无法访问数据库。



最后,俺们再看下手册上咋写的:

警告:在使用永久连接时还有一些特别的问题需要注意。例如在永久连接中使用数据表锁时,如果脚本不管什么原因无法释放该数据表锁,其随后使用相同连接的脚本将会被永久的阻塞,使得需要重新启动 httpd 服务或者数据库服务。另外,在使用事务处理时,如果脚本在事务阻塞产生前结束,则该阻塞也会影响到使用相同连接的下一个脚本。不管在什么情况下,都可以通过使用 register_shutdown_function() 函数来注册一个简单的清理函数来打开数据表锁,或者回滚事务。或者更好的处理方法,是不在使用数据表锁或者事务处理的脚本中使用永久连接,这可以从根本上解决这个问题(当然还可以在其它地方使用永久连接)。
回复
yuexiangyun 2010-07-29
你以前安装过mysql吧?
卸载MySQL,然后手动删除my.ini文件,再把MySQL重新安装一次。
回复
jumpheightway 2010-07-29
记住一点就行了
每次处理都要处理得很干净
回复
fancyivan 2010-07-29
顶楼上的,mysql的运行方式需要注意,以前碰到过这种情况,跟楼主的症状基本一致。
回复
Dleno 2010-07-29
C盘只用了几百M??
怎么可能才只用了几百M??

mysql的data目录默认在C:\Documents and Settings下。自己找下。

把data目录备份出来。
删除mysql,以前用的myisam的方式运行,再装的时候改成innodb的方式运行,反之亦然。
回复
zhanghaoranjn 2010-07-29
顶。。。。。。。。。。。

回复
caizhuguanguan 2010-07-29
顶。。。接分
回复
发动态
发帖子
基础编程
创建于2007-09-28

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
社区公告
暂无公告