[PHP]PDO的dsn对mysql的连接影响
dsn的host字段中,'localhost'是一个影响其连接协议的值,当host取值'localhost',PDO会坚持使用unixsocket的方式去连接数据库:
'mysql:host=localhost;dbname=mydb'
以上配置,PDO会寻找php.ini中的pdo_mysql.default_socket值,尝试运用此路径通过unixsocket来连接mysql,如果此配置值不存在或者路径不可用,PDO就会抛出异常:
Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] No such file or directory in xxx
以上错误信息是根据pdo_mysql.default_socket值的实际情况描述的,例如,如果路径因权限原因无法访问,则抛出:
Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] Permission denied in xxx
也可以通过dsn的unix_socket字段来指定socket文件路径,意义等同于pdo_mysql.default_socket
'mysql:unix_socket=/var/lib/mysql/mysql.sock;dbname=mydb'
运用这种方式就不需要显式指定host字段了,PDO总是在使用unixsocket连接方式时把host设置为localhost,这是无法通过显式指定host改变的:
'mysql:host=my_host;unix_socket=/var/lib/mysql/mysql.sock;dbname=mydb'
以上配置,最终host还是localhost,my_host不会被预期设置;
所以,如果你一定需要用TCP的方式连接mysql,务必不能把host=localhost;
成功连接上mysql后你可以调用PDO实例的getAttribute(PDO::ATTR_CONNECTION_STATUS)方法来返回连接方式;