标题:[疑难问题]PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): too many connections in 出处:向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除 时间:Sat, 13 Feb 2016 01:48:56 +0000 作者:jackxiang 地址:http://jackxiang.com/post/8500/ 内容: 背景:把mysql换成mysqli时出现,连接数过多,其实际上并不是,原因是我挪动了一下php的sock文件位置导致,因这几个socket修改没有修改完全,于是出现了too many connections ,从mysql里show processlist并没有发现真的有连接,其实用tshark抓下包估计能看到(http://jackxiang.com/post/7458/),并没有发出请求,而估计是mysqli的客户端自己报出来的,别看这个问题小,搞了老半天,都想重新安装Php了,发现原来是路径写错了同时mysqli的客户端提示连接数过多的误提示导致方向走错了。如下: [root@iZ25z0ugwgtZ etc]# grep -r "mysql.sock" ./ ./php.ini:pdo_mysql.default_socket=/data/runsock/mysqlsock/mysql.sock ./php.ini:;mysql.default_socket = /tmp/mysql.sock ./php.ini:mysql.default_socket = /data/runsock/mysqlsock/mysql.sock ./php.ini:mysqli.default_socket = /data/runsock/mysql.sock //这个位置被挪动到,/data/runsock/mysqlsock/mysql.sock导致。 修改后记得重启动php-fpm: [root@iZ25z0ugwgtZ etc]# service php-fpm restart Gracefully shutting down php-fpm . done Starting php-fpm done 还会出现在localhost时连接找不到sock时提示诡异,如下:Warning: mysqli::mysqli(): (HY000/2002): No such file or directory in 开始的回答有点不严谨,估计也没有解决问题,修改了答案,解决办法如下,或配置php.ini,参考:http://jackxiang.com/post/8499/ $db = new MySQLi('localhost', 'root', 'root', 'my_db', '3306', '/var/run/mysqld/mysqld.sock') 问题出现的原因: 当主机填写为localhost时MySQL会采用 unix domain socket连接,当主机填写为127.0.0.1时MySQL会采用TCP/IP的方式连接。使用Unix socket的连接比TCP/IP的连接更加快速与安全。这是MySQL连接的特性,可以参考官方文档的说明4.2.2. Connecting to the MySQL Server: On Unix, MySQL programs treat the host name localhost specially, in a way that is likely different from what you expect compared to other network-based programs. For connections to localhost, MySQL programs attempt to connect to the local server by using a Unix socket file. This occurs even if a --port or -P option is given to specify a port number. To ensure that the client makes a TCP/IP connection to the local server, use --host or -h to specify a host name value of 127.0.0.1, or the IP address or name of the local server. You can also specify the connection protocol explicitly, even for localhost, by using the --protocol=TCP option. 这个问题有以下几种解决方法: 使用TCP/IP代替Unix socket。即在连接的时候将localhost换成127.0.0.1。 修改MySQL的配置文件my.cnf,指定mysql.socket的位置: /var/lib/mysql/mysql.sock (你的mysql.socket路径)。 直接在php建立连接的时候指定my.socket的位置(官方文档:mysqli_connect)。比如: $db = new MySQLi('localhost', 'root', 'root', 'my_db', '3306', '/var/run/mysqld/mysqld.sock') 如果哪里没有说清楚或者说错了,欢迎提出了~~ ______________________排查要点如下_______________________________ warning: mysqli::real_connect(): (hy000/1040): too many connections in: 出现场景 :手动编译安装mysql,并制定安装位置,php以localhost方式连接mysql 原因分析 :手动编译安装制定位置后所有的mysql文件都在制定的目录或者data目录下面,php默认只会寻找/temp/mysql.sock找这个sock文件,所以会导致sock文件无法找到。 解决方法 : 1.给sock文件做个软链 ln -s /data/mysqldb/mysql.sock /tmp/mysql.sock; 或者 2.修改php的默认mysql.sock连接地址 mysql.default_socket=/data/mysqldb/mysql.sock 3.使用tcp socket的方式进行连接 mysql('127.0.0.1','username','passwod'); 来自:http://ju.outofmemory.cn/entry/144221 Generated by Jackxiang's Bo-blog 2.1.1 Release