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 服务器上。

BTW:
linux开着selinux连接MySQL在测试中基本上属于1ms+,禁掉selinux后在0.96左右。selinux还是要禁掉的。
既然又怀疑是PHP的问题就写一个程序测试(禁掉selinux后):
cat tconn.php

 代码如下 复制代码

function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
 
$time_start = microtime_float();
for ( $i=0; $i<30000; $i++){ 
$dbh=new mysqli("XXX.XXX.XXX.XXX", "wubx", "wubxwubx", "userdb", 3308);
$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

问题解决

现象2

MYSQL.测试连接mysql 提示'Fatal error: Call to undefined function mysql_connect()"环境j是:windows xp sp2 en , apache2.2,mysql5.1rc.php5.28。

这个提示,会不会是php没有加载到连接mysql的库文件呢? 在启动apache server后.我试着删除'php5ts.dll'和'libmysql.dll'.提示不能删除.说明有程序在用着这两个库文件.说明是有加载的.(当然有许多方法来测试.比如可以用一些软件,查看程序服务加载的所有库文件.也是可以然而ap也说指是php.ini设置有问题.那我就不看别的.我就重点针对php.ini配置.

 在没有迷信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 指定为 % 则表示允许所有的机器访问。           一般来说出于安全方面的考虑,遵循最小权限原则, 权限的问题就不多讲了, 不会的自己查手册。 确定了权限没问题的话进行下一步:

3. 要排查MySQL的配置         

 检查mysql的配置文件, Linux下MySQL的配置文件叫 my.cnf windows下的叫 my.ini,检查这个配置项:           –bind-address=IP          

引用手册里的一段话:

The IP address to bind to. Only one address can be selected. If this option is specified multiple times, the last address given is used.           If no address or 0.0.0.0 is specified, the server listens on all interfaces.          

绑定的IP, 只能绑定一个IP, 如果绑定多个IP, 则以最后一个绑定的为准。           如果没有绑定或绑定 0.0.0.0, 服务器监听所有的客户端。

 
我曾经就被这个东西害惨过, 有一次搞了一个下午没搞定, 检查网络通的, 检查权限没问题, 客户端就是死活连不上, 一看手册明白了。 所以有什么问题还是要多看手册

时间: 2024-10-14 18:58:35

php连接不上MySQL问题解决办法的相关文章

eclipse连接mysql-eclipse 连接不上mysql数据库,请知道的给个答案给小弟啊!

问题描述 eclipse 连接不上mysql数据库,请知道的给个答案给小弟啊! 用的是mysql 5.6 以前用JDBC连接上过的,但是现在就不行了,不清楚原因,也在网上找过,但是找不到解决的办法,连接的JAR包是mysql-connector-java-5.1.26-bin.jar,请知道的大神解答一下小弟 这是使用JDBC连接MYSQL import java.sql.*; public class TestMysqlConnection { public static void main

mysql-Eclipse用JDBC连接不上MYSQL

问题描述 Eclipse用JDBC连接不上MYSQL 使用JDBC的方法连接不上MySQL,我的网络是校园网,登陆后IP会变化,不知道这个对连接有没有什么影响,用的是mysql 5.6 以前用JDBC连接上过的,但是现在就不行了,不清楚原因,也在网上找过,但是找不到解决的办法,连接的JAR包是mysql-connector-java-5.1.26-bin.jar,提示错误Communication link failure, message from server: "Can't get hos

php连接不上mysql但mysql命令行操作正常的解决方法

 这篇文章主要介绍了php连接不上mysql但mysql命令行操作正常的解决方法,需要的朋友可以参考下 故障状况:php网站连接mysql失败,但在命令行下通过mysql命令可登录并正常操作. 解决方案: 1.命令行下登录mysql,执行以下命令:  代码如下:show variables like 'socket'; 执行后会得到类似于如下回显:  代码如下: "Variable_name"        "Value" "socket"  

visual studio 2010-vs2010用C语言为什么连接不上mysql

问题描述 vs2010用C语言为什么连接不上mysql MYSQL *mysql;mysql=mysql_init(NULL);if(!mysql_real_connect(mysqllocalhost""root""0412qwer""xs""3306NULL0)) AfxMessageBox(_T(""数据库连接失败""));else{AfxMessageBox(_T("&

MySQL sleep进程连接过多卡住了问题解决办法

MySQL sleep进程连接过多原因分析 当php的页面执行结束时,会自动释放掉一切.相信很多人都跟我想的一样.但事实证明并不是这样.比如session就不会随着页面执行完毕而释放. php的垃圾回收机制,其实只针对于php本身.对于mysql,php没权利去自动去释放它的东西.如果你在页面执行完毕前不调用mysql_close(),那么mysql那边是不会关闭这个连接的.如果你是用的是pconnect方式,即使你在页面执行完毕前调用mysql_close(),也无法另mysql关闭这个连接

三星I9158P手机提示&quot;未在网络上注册&quot;问题解决办法

图1: 这个是我在打电话时碰到如下提示   问题解决办法 1.我们现在回到手机桌面,我们点击[应用程序].   2.之后我们再找到里边的[设定]按钮,细节如下图所示.   3.再者我们在设定中我们点击[连接]在打开连接中找到[更多网络]点击它.   4.如下图所示在这里有一个[移动网络]我们点击它.   5.在此我们进入之后点击[网络运营商]细节如下图所示.   6. 然后我们把网络形式的我[请自动选择]即可自动进行搜索.     完成以上操作后,左上角的"三角形感叹号"图标将消失,且

MyEclipse连接不上MySQL?

问题描述 做bbs项目的时候MyEclipse连接不上数据库,各位大神,麻烦帮我看看这是什么原因? 解决方案 解决方案二:解决了是jar包的问题解决方案三:换一个数据库驱动就行了.解决方案四:说的很明白了,你的mysql驱动有问题...换一个就好了解决方案五:推荐你用这个解决方案六:你得驱动类不对,你可以根据你得文件路径得到Driver驱动类,比如:com.mysql.jdbc.Driver解决方案七:接分,嘿嘿LZ威武

oracle适配器连接不上的解决办法_oracle

racle 的Developer连接不上报错:listener does not currently know of SID given in connect descriptor 解决办法: 在 D:\app\Administrator\product\..\dbhome_\NETWORK\ADMIN中找到listener.ora文件,修改后的文件在"下面"中,复制并覆盖就ok了. # listener.ora Network Configuration File: D:\app\A

小米助手连接不上手机怎么办 小米助手连接不上手机解决办法

  方法一.检查数据线 小米手机与电脑连接的数据线是否正常,检查一下看看有没有松动或使用的不是正品数据线. 方法二.打开USB调试 现在的智能手机连接电脑必须开启USB调试模式,否则就可能连接不上,所以我们要打开开发者选项,然后再重启手机即可. 方法三.安装手机驱动 USB调试开启后,我们需要给手机安装驱动程序了,否则小米助手识别不了手机了. 方法四.其他助手相冲突 如果安装了几个助手在电脑中我们可以删除它,然后只只开启小米手机助手即可. 方法五.升级到最新版 小米手机助手已经升级到最新的小米助