[实践Ok]PHP连接mysql找不到'/tmp/mysql.sock及PDO连接时报错问题分析

jackxiang 2011-5-26 14:43 | |


实践证明上面这两个都会指向编译时的mysqld.sock文件位置:
php -i|grep mysqld.sock
'--with-mysql-sock=/var/run/myslqd/mysqld.sock'
mysqli.default_socket => /var/run/myslqd/mysqld.sock => /var/run/myslqd/mysqld.sock
pdo_mysql.default_socket => /var/run/myslqd/mysqld.sock => /var/run/myslqd/mysqld.sock




PDO连接Mysql出现如下:Connection failed: SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/usr/local/webserver/mysql/data/mysql.sock' (2)

如下命令编译php后,注意其中有一行是涉及到PDO和MysqlLi的--with-pdo-mysql=/usr/local/webserver/mysql
编译PHP:
wget http://cn.php.net/distributions/php-5.3.6.tar.gz
./configure --prefix=/usr/local/webserver/php --with-config-file-path=/usr/local/webserver/php/etc --with-mysql=/usr/local/webserver/mysql --with-mysqli=/usr/local/webserver/mysql/bin/mysql_config --with-iconv-dir=/usr/local/libiconv --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-fpm --enable-force-cgi-redirect --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-ldap --with-ldap-sasl
老外这样说的:configure --with-pdo-mysql --with-mysql-sock=/usr/local/webserver/mysql/data/mysql.sock... This value can either be set at compile time if a domain socket is found at configure.
在:--socket=/data0/data/mysql.sock  ,这时你一是可以建立软链接
这儿是可以重新编译一次PDO来实现,二是能通过软链接来实现,重新编译PDO如下:
PDO_MYSQL:
http://pecl.php.net/package/PDO_MYSQL
wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz
tar zxvf PDO_MYSQL-1.0.2.tgz
cd PDO_MYSQL-1.0.2
/usr/local/webserver/php/bin/phpize
./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-pdo-mysql=/usr/local/webserver/mysql
make
make install
cd ../
要么你直接在编译PHP源代码时编译进去,这儿单独编译时可能会找不到mysql.h,造成上面一一致的原因是我修改了原来Mysql默认的配置:mysql.sock的Path,同时修改了PHP里的Mysql常规Path,而这个PDO的PAth没有在PHP.ini里体现出来,没法修改,只有建立软链接或者重新编译才行。这就是根本原因。
(1)直接建立软链接指向其位置:ln -s /data0/data/mysql.sock   /usr/local/webserver/mysql/data/mysql.sock 立竿见影。
(2)重新编译PDO【注意把:mysql.sock设置一下位置,让PDO知道不是以前的那个位Path了】
(3)这儿发现第三种方法,修改好编译好的二进制so文件:
vi /usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/pdo_mysql.so
找到那个写死了的mysql.sock的配置处,把路径给修改下,再修改回去,呵呵,如下:
@^@^@/root/jackxiang.com/PDO_MYSQL-1.0.2/mysql_driver.c^@^@/usr/local/webserver/mysql/data/mysql.sock^@^@
修改为这样:
@/root/jackxiang.com/PDO_MYSQL-1.0.2/mysql_driver.c^@^@/data0/data/mysql.sock^@^@/root/jackxiang.com
强制写入,这时,我用的是Nginx下Php的FastCGI,得重启下PHPFastCGI,而要是Apache得重启下Apache即可。
这儿的修改可能有些问题:
root@116.255.139.240:/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626# sh /root/runphp.sh
Starting php-fpm /etc/init.d/phpfpm: line 53: 12947 Segmentation fault      $php_fpm_BIN $php_opts
failed
但是说明一个问题:这个配置/usr/local/webserver/mysql/data/mysql.sock确实是写死在这个:pdo_mysql.so 文件里的!!!

php -i|grep mysql.sock得到如下两个设置的地方,
mysql.default_socket => /data0/data/mysql.sock => /data0/data/mysql.sock  //常规的Mysql的句柄,和下面不一样导致,pdo报错。
MYSQLI_SOCKET => /usr/local/webserver/mysql/data/mysql.sock  //PDO的Mysql句柄
为何这上面两个不一样呢?请查看: php连接到MySQL数据库服务器时三种主要的API:mysql,mysqli,pdo区别及联系
PHP用PDO连接Mysql时出现问题,PHP代码如下:
<?php
     $dsn = "mysql:host=localhost;dbname=360syn_mysql";
     $db = new PDO($dsn, 'root', '');

root@116.255.139.240:/data0/htdocs/happycun.com# php pdo.php
PHP PDOException:  SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/usr/local/webserver/mysql/data/mysql.sock' (2) in /data0/htdocs/happycun.com/pdo.php on line 3
也就是这个设置不对:MYSQLI_SOCKET => /usr/local/webserver/mysql/data/mysql.sock
查看Mysql的mysql.sock是在哪儿?如下命令查看:
ps aux|grep mysql
/usr/local/webserver/mysql/bin/mysqld --basedir=/usr/local/webserver/mysql --datadir=/data0/data --plugin-dir=/usr/local/webserver/mysql/lib/plugin --user=mysql --log-error=/data0/data/error_log/log-error.log --pid-file=/data0/data/localhost.localdomain.pid --socket=/data0/data/mysql.sock --port=3306




是谁不小心把/tmp/mysql.sock删除了,最后建立软连接才好了!

原因:
其本质是在编译Mysql的时候可能此时mysql.sock是在/tmp/mysql.sock,而可能在实际配置Mysql的时候,vi /etc/my.cnf 其定义到了:/usr/local/services/mysql-5.0.2*/var/mysql.sock
---------------------
来源网上:
摘要:解决不能通过mysql .sock连接MySQL问题 这个问题主要提示是,不能通过 '/tmp/mysql .sock'连到服务器,而php标准配置正是用过'/tmp/mysql .sock',但是一些mysql 安装方法 将 mysql .sock放在/var/lib/mysql .sock或者其他的什么地方,你可以通过修改/etc/my.cnf文件来修正它,打开文件,可以看到如下的东东:   [mysql d]   socket=/var/lib/mysql .sock   改一下就好了,但也会引起其他的问题,如mysql 程序连不上了,再加一点:   [mysql ]   socket=/tmp/mysql .sock   或者还可以通过修改php.ini中的配置来使php用其他的mysql .sock来连,这个大家自己去找找    或者用这样的方法:   ln -s /var/lib/mysql /mysql .sock /tmp/mysql .sock 成功了,就是这样ln -s /var/lib/mysql /mysql .sock /tmp/mysql .sock OK!

[mysqld]
socket=/var/lib/mysql.sock

改一下就好了,但也会引起其他的问题,如mysql程序连不上了,再加一点:

[mysql]
socket=/tmp/mysql.sock

或者还可以通过修改php.ini中的配置来使php用其他的mysql.sock来连:
On my RedHat-Box the socket of mysql is /var/lib/mysql/mysql.sock. In your php.ini you will find a line
mysql.default_socket = /tmp/mysql.sock
change it to
mysql.default_socket = /var/lib/mysql/mysql.sock
Then restart apache and it will work.
---
如果做了软链接依旧连接不上,提示PHP连接mysql找不到'/tmp/mysql.sock,请参阅Mysql绑定端口引发的:ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1':
http://jackxiang.com/post/4305/

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/4327/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2021-3-5 23:25
评论列表
2011-12-16 16:40 | pengruncs925 Email Homepage
抢沙发,还没有找到传说中的沙发
2011-5-31 03:09 | fjiazauu Email Homepage
一个活在本人世界里的人
分页: 1/1 第一页 1 最后页
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]