PHP无法用Socket方式连接MySQ

问题描述

今天在一台新的服务器中安装了php7.2,mysql-5.6后。测试用php连接mysql时发现无论如何php都连接不上mysql数据库,排除了数据库账号错误,并且php已经安装了连接数据库的mysqlnd扩展。

问题排查

使用php连接测试脚本,查看到底是什么错误导致php连接不上mysql的。

以下是php连接mysql的php测试脚本mysql_connect_test.php

<?php
$dbname = 'mysql';
$dbuser = 'root';
$dbpass = '1234';
$dbhost = 'localhost';
$connect=mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
// 检查连接
if (!$connect)
{
    die("连接错误: " . mysqli_connect_error());
}
    die("连接成功...\n");
?>

注意观察php脚本中,$dbhost的值我给的是localhost,也就是使用socket进行连接数据库。

php_connect_mysql-1.png

经过测试,发现PHP报错:No such file or directory in /root/mysql_connect_test.php on line 6

报错说db-connect-test.php中的第6行有问题,下面看下第8行的代码:

$connect=mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);

mysqli_connect()这是php连接数据库的一个函数,根据报错提示这里面缺少文件或目录。

mysqli_connect()函数的参数有:host,username,password,dbname,port,socket。

在mysqli_connect()函数中,我已经加入了host,username,password,dbname这4个参数了。

经过调试,发现当我加入socket和port参数时,php就可以正常连接数据库了。

下面是加入了socket参数后的php脚本:

<?php
$dbname = 'mysql';
$dbuser = 'root';
$dbpass = '1234';
$dbhost = 'localhost';
$dbport = '3306';
$dbsocket = '/tmp/mysql.sock';
$connect=mysqli_connect($dbhost, $dbuser, $dbpass, $dbname, $dbport, $dbsocket);
// 检查连接
if (!$connect)
{
    die("连接错误: " . mysqli_connect_error());
}
    die("连接成功...\n");
?>

到这里可以分析出,php连接数据库的失败的原因很可能是数据库socket连接造成的。

为了证明这个结论,让PHP使用TCP/IP连接数据进行测试:

<?php
$dbname = 'mysql';
$dbuser = 'root';
$dbpass = '1234';
$dbhost = '127.0.0.1';
$connect=mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
// 检查连接
if (!$connect)
{
    die("连接错误: " . mysqli_connect_error());
}
    die("连接成功...\n");
?>

测试结果如下,可以看到使用TCP方式连接是可以成功的。

php_connect_mysql-2.png

解决问题

  • 查看mysql的socket文件

可以看到mysql使用的socket是/tmp/mysql.sock

mysql> show variables like "socket";
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| socket        | /tmp/mysql.sock |
+---------------+-----------------+
1 row in set (0.00 sec)
  • 查看php默认使用的mysql socket

发现php默认使用的mysql socket是 /var/mysql/mysql.sock

[root@centos ~]# php -r 'echo phpinfo();' | grep mysql.sock
mysqli.default_socket => /var/lib/mysql/mysql.sock => /var/lib/mysql/mysql.sock
pdo_mysql.default_socket => /var/lib/mysql/mysql.sock => /var/lib/mysql/mysql.sock

经过对比,发现php和mysql指定的数据库socket文件路径不一样,这可能也就是导致php在使用socket连接数据库时出错的原因。

这里先给出2个解决办法:

  • 方法一:修改mysql的配置文件,配置socket与php的一致
[root@centos ~]# mkdir -p /var/lib/mysql
[root@centos ~]# vim /etc/my.cnf
[mysqld]
socket = /var/lib/mysql/mysql.sock
  • 方法二:修改php的配置文件,配置socket与mysql的一致

更改php.ini中的 mysql.default_socketmysqli.default_socketpdo_mysql.default_socket。但在PHP72版本中,php.ini配置文件中没有mysql.default_socket,可以不进行设置此条配置。

[root@centos ~]# vim /etc/php.ini
mysqli.default_socket = /tmp/mysql.sock
pdo_mysql.default_socket = /tmp/mysql.sock

PHP72安装完后,会在bin目录下生成php-config、zts-php-config两个脚本文件,这连个脚本用于获取所安装的php配置的信息。这2个脚本中的socket路径也只默认为/var/lib/mysql/mysql.sock

修改脚这两个文件来制定mysql socket(可选,非必须修改):

[root@centos ~]# sed -i 's@--with-mysql-sock=/var/lib/mysql/mysql.sock@--with-mysql-sock=/tmp/mysql.sock@g' /bin/php-config
[root@centos ~]# sed -i 's@--with-mysql-sock=/var/lib/mysql/mysql.sock@--with-mysql-sock=/tmp/mysql.sock@g' /bin/zts-php-config

修改完配置再重启php-fpm后,php就可以使用socket的连接方式连接数据库了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343