php连接不上MySQL问题处理办法
发布时间:2022-07-05 15:57:13 所属栏目:PHP教程 来源:互联网
导读:php连接不上mysql的原因有很多种常用的可能是函数没开启或mysql数据库配置有问题,下面我来给大家介绍php连接不上MySQL一些问题的分析与解决方法. 现象1 在PHP error log里发现:PHP Warning: mysqli::mysqli(): (HY000/2003): Cant connect to MySQL server o
php连接不上mysql的原因有很多种常用的可能是函数没开启或mysql数据库配置有问题,下面我来给大家介绍php连接不上MySQL一些问题的分析与解决方法. 现象1 在PHP error log里发现:PHP Warning: mysqli::mysqli(): (HY000/2003): Can’t connect to MySQL server on ‘XXX.XXX.XXX.XXX’ (99) in /u1/www/XXXX.php on line 10 PHP Warning: mysqli::close(): Couldn’t fetch mysqli in /u1/www/XXXX.php on line 11 推断:只有在高并发的环境下出现. 诊断分析:通过MySQL数据库上抓包,没发现异常,又把目标转到php 服务器上. $time_start = microtime_float(); for ( $i=0; $i<30000; $i++){ $dbh=new mysqli("XXX.XXX.XXX.XXX", "wubx", "wubxwubx", "userdb", 3308);//开源代码phpfensi.com $dbh->close(); } $time_end= microtime_float(); $time_use= ($time_end - $time_start)/30000; print "$time_usen"; #php tconn.php 0.00090954260031382 再次运行就开始大量的报错. PHP Warning: mysqli::mysqli(): (HY000/2003): Can't connect to MySQL server on 'XXX.XXX.XXX.XXX' (99) in /u1/www/XXXX.php on line 10 PHP Warning: mysqli::close(): Couldn't fetch mysqli in /u1/www/XXXX.php on line 11 中止该程序后,通过 #strace php tconn.php 运行得到: connect(3, {sa_family=AF_INET, sin_port=htons(3308), sin_addr=inet_addr("XXX.XXX.XXX.XXX")}, 16) = -1 EADDRNOTAVAIL (Cannot assign requested address) shutdown(3, 2 /* send and receive */) = -1 ENOTCONN (Transport endpoint is not connected) 看到这个大概明白是本地的网络可能注册不上了,也难怪在MySQL抓包看也正常,看样子是本地tcp不能重用造成的,改一下在测试,代码如下: sysctl -w net.ipv4.tcp_tw_reuse=1; 再次测试问题不存在了,在这个上面碰了一下后顺便改一下/etc/sysctl.conf添加如下代码: net.ipv4.tcp_max_syn_backlog = 819200 net.core.netdev_max_backlog = 400000 net.core.somaxconn = 4096 net.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_tw_recycle=0 #sysctl -p 问题解决. 在没有迷信php.ini是正确下.终于发现.php.ini中漏了这一行,PHPIniDir "你的php目录": #(例如: PHPIniDir "c:/php") 重启apache server,然后,用网上常用的方法,以下为引用的内容: <?php $link=mysql_connect('localhost','用户名','password'); if(!$link) echo "失败!"; else echo "成功!"; mysql_close(); ?> 测试一下,就可以了. 总结一下这些问题: 1. 首先要排查网络问题和防火墙的问题 这个是必须的,你要是连MySQL的服务器都连不上, 那还访问什么?怎么检查呢?ping一下:ping 192.168.0.11,ping 的通的话,再去检查一下 3306端口是不是被防火墙给挡掉了,ping 192.168.0.11:3306,或者干脆把防火墙关掉,service iptables stop (Redhat ) 或 ufw disable(ubuntu),这一步没问题的话, 开始下一步. 2. 要排查有没有访问权限 说到访问权限,MySQL分配用户的时候会指定一个host, 比如我的 host 指定为 192.168.0.5 ,那么这个账号就只能 .5 这一台机器访问,其他的机器用这个账号访问会提示没有权限。 host 指定为 % 则表示允许所有的机器访问,一般来说出于安全方面的考虑,遵循最小权限原则,权限的问题就不多讲了,不会的自己查手册,确定了权限没问题的话进行下一步. 我曾经就被这个东西害惨过,有一次搞了一个下午没搞定,检查网络通的,检查权限没问题,客户端就是死活连不上,一看手册明白了,所以有什么问题还是要多看手册. (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |