在Prestashop 1.6.1中,在函数_getPDO中的/classes/db/DbPDO.php中,我看到PDO -- dsn连接字符串是有条件构建的。特别令人感兴趣的是以下片段:
$dsn = 'mysql:';
if ($dbname)
$dsn .= 'dbname='.$dbname.';';
if (preg_match('/^(.*):([0-9]+)$/', $host, $matches))
$dsn .= 'host='.$matches[1].';port='.$matches[2];
elseif (preg_match('#^.*:(/.*)$#', $host, $matches))
$dsn .= 'unix_socket='.$matches[1];
else
$dsn .= 'host='.$host;那么,它希望在$host中看到什么,以便将连接类型设置为unix_socket?
我想它是在查看_DB_SERVER_变量在settings.inc.php中。是那么回事吗?目前,我已将其设置为“localhost”。我需要将其更改为什么,以便PDO使用套接字/var/lib/mysql/mysql.sock进行连接?
谢谢你的建议,雷恩
发布于 2015-08-11 23:54:23
从代码中看,这似乎是其中的诀窍:
define('_DB_SERVER_', 'unix:/var/lib/mysql/mysql.sock');在冒号之前发生的事是无关紧要的。重要的是字符串从行的开头开始,有一个文字冒号然后是斜杠(":/"),之后的一切都是套接字文件的绝对路径。因此,此模式需要到套接字的绝对路径。
_DB_SERVER_常量似乎是基于文档配置PrestaShop数据库的规范方法。
发布于 2015-08-12 00:07:03
我不确定我是否明白。但是,首先必须定位mysql套接字文件路径。通常是在my.cnf mysql配置中(在我的Debian:/etc/mysql/my.cnf中)。然后搜索socket条目下的[client]。所以:
# see my.cnf under [client]
$unix_socket = '/var/run/mysqld/mysqld.sock';
$user = 'user';
$passwd = 'secret';
$dsn = 'mysql:unix_socket=' . $unix_socket . ';dbname=dbname';
$pdo = new PDO($dsn, $user, $passwd);注意,当主机名设置为"localhost“时,默认情况下通过域套接字连接到服务器。
https://stackoverflow.com/questions/31736166
复制相似问题