PRESTASHOP:如何告诉 PDO class 通过套接字而不是 'localhost' 进行连接?

PRESTASHOP: How to tell PDO class to connect through a socket instead of 'localhost'?

在 Prestashop 1.6.1 中的 /classes/db/DbPDO.php 函数中 _getPDO 我看到 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;

那么,为了将连接类型设置为 unix_socket,它期望在 $host 中看到什么?

我想它正在查看 settings.inc.php 中的 _DB_SERVER_ 变量。那正确吗? 目前我将其设置为 'localhost'。我需要将其更改为什么以便 PDO 使用套接字连接 /var/lib/mysql/mysql.sock?

感谢您的任何建议, 雷恩

查看代码,这似乎是诀窍:

define('_DB_SERVER_', 'unix:/var/lib/mysql/mysql.sock');

冒号前的内容无关紧要。重要的是字符串从一行的开头开始,有一个文字冒号然后是斜杠 (":/"),之后的所有内容都是套接字文件的绝对路径。因此,此模式需要套接字的绝对路径。

_DB_SERVER_ 常量似乎是根据文档配置 PrestaShop 数据库的规范方法。

不确定我是否明白了。 但首先你必须找到 mysql unix 套接字文件路径。通常它在 my.cnf mysql 配置中(在我的 Debian 中:/etc/mysql/my.cnf)。然后在 [client] 下搜索 socket 条目。所以:

# 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" 时,默认情况下通过域套接字连接到服务器。