今天一个刚做好的项目(防骗吧) 在本地的wamp环境中使用都是正常的,可今天放到服务器上面却出现了错误,数据库连接,第一反应就是查数据库,找代码调试,上百度等等去找解决方案,最后还是解决了,下面来说说解决的方法。
问题的产生:今天项目上传到正式的服务器环境里产生报错,报错的内容:
ERR: SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '=/tmp/mysql.sock'
1、第一反应就是数据库出现了问题,以为是sock文件不存在或是被删除了,可是当我们进入服务器的时候发现/tmp/mysql.sock的文件是存在的。说明不是文件不存在导致的错误。
2、于是继续查找问题,以为是mysql的配置的sock和php配置的sock不一致导致的。于是继续排查问题
进入mysql的配置文件:/etc/my.cnf, 发现socket的目录也是/tmp/mysql.sock ,说明这个不是mysql的配置出错了。
3、于是继续排查问题,看看是不是php的配置的mysql sock 的目录不一样导致的。
进入php的配置文件:/usr/local/webserver/php/etc/php.ini 发现里面的里的socket 目录的文件路径也是一样的。 说明这个不是php的配置文件出现问题了。
由于php的配置文件也是没有错误的,那会是哪里出错的了呢,带着疑问继续排查跟着,原来项目的数据库连接是采用了PDO_MYSQL来做数据库连接,于是想到的php的pdo_mysql扩展里的sock 是否一致呢,经过排查发现,正是这个sock不对应导致的问题,里面没有配置sock。
经过不断的排查终于发现问题了,下面就是解决的方法:
第一:由于php在编译的的时候并没有把--with-pdo-mysql编译进去导致的pdo连接数据库的时候找不到sock文件,可发现我们的php是已经编译好的了,那只能增加编译了,增加编辑模块的方法大家可以试下,由于我们缺少编译pdo-mysql。
a、进入php编译的源码目录:/home/softsrc/php-5.6.10/ext/pdo_mysql/ 找到pdo_mysql 文件夹(不同安装方式,目录可能不一样,大家根据自身)
cd /home/softsrc/php-5.6.10/ext/pdo_mysql/ #查找php的扩展目录 /usr/local/webserver/php/bin/phpize #编译pdo_mysql模块 ./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-pdo-mysql=/usr/local/webserver/mysql make make install
这样就是编译了pdo_mysql , 查找/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so ,如果已经存在就表示已经安装成功了。
b、把扩展放进php的配置文件php.ini,在配置文件的
extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20131226/"
extension = "pdo_mysql.so"
最后重启一下php 这样php_mysql就编辑成功 了。查找配置看是多pdo_mysql.default_socket的配置了,就表示环境已经安装成功了。
最后把测试代码放给大家,大家可以测试测试,这样就pdo可以使用mysql端口来连接成功。
$dbhost = 'localhost'; $dbport = '3306'; $dbuser = 'root'; $dbpwd = 'dbpwd'; $dbname = 'dataname'; $option=array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8;", PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC); try{ $db = new PDO("mysql:host={$dbhost};port={$dbport};dbname={$dbname}", $dbuser, $dbpwd,$option); echo "PDO链接数据库成功"; }catch(Exception $e){ echo $e->getMessage()." "; exit(); }
运行的结果:PDO链接数据库成功object(PDO)#1 (0) { }