我遇到了类似的问题,不同之处在于我使用的 MySQL 服务器的连接字符串是 host:port:socket 的形式,如 localhost:3306:/var/lib/mysock。
我正在尝试安装 mediawiki-1.22.6,但初始数据库检查失败。仅使用 localhost 对我不起作用,因为我使用的 MySQL 安装需要端口号和套接字。
我最终对 mediawiki-1.22.6 php 脚本进行了以下更改,以允许解析 host:port:socket 形式的连接字符串。
警告:这些更改特定于我的站点和环境,解析功能更改可能无法与其他字符串一起正常工作,例如,如果未在 localhost:/var/lib/mysock 中指定端口号。
这是我为完成安装所做的具体更改。
在 Includes 的相对目录中的文件 IP.php 中有一个函数 public static function splitHostAndPort( $both ),它接受连接字符串并将其解析为在文件中的函数 protected function mysqlConnect( $realServer ) 中调用 real_connect() 所需的部分相关文件夹中的DatabaseMysqli.php 包括/db。
在splitHostAndPort()函数中,我将函数修改为如下:
public static function splitHostAndPort( $both ) {
if ( substr( $both, 0, 1 ) === '[' ) {
if ( preg_match( '/^\[(' . RE_IPV6_ADD . ')\](?::(?P<port>\d+))?$/', $both, $m ) ) {
if ( isset( $m['port'] ) ) {
return array( $m[1], intval( $m['port'] ) );
} else {
return array( $m[1], false );
}
} else {
// Square bracket found but no IPv6
return false;
}
}
$numColons = substr_count( $both, ':' );
if ( $numColons >= 2 ) {
// Is it a bare IPv6 address?
if ( preg_match( '/^' . RE_IPV6_ADD . '$/', $both ) ) {
return array( $both, false );
} else {
// Not valid IPv6, but too many colons for anything else
// may be of the form localhost:port:socket
// return false;
}
}
if ( $numColons >= 1 ) {
// Host:port:socket?
$bits = explode( ':', $both );
if ( preg_match( '/^\d+/', $bits[1] ) ) {
if ($numColons > 1) {
return array( $bits[0], intval( $bits[1] ), $bits[2] );
} else {
return array( $bits[0], intval( $bits[1] ) );
}
} else {
// Not a valid port
return false;
}
}
// Plain hostname
return array( $both, false );
}
接下来我修改了mysqlConnect() 函数,让它检查端口和套接字是否都指定如下:
// Other than mysql_connect, mysqli_real_connect expects an explicit port
// parameter. So we need to parse the port out of $realServer
$socketname = $port = null;
$hostAndPort = IP::splitHostAndPort( $realServer );
if ( $hostAndPort ) {
$realServer = $hostAndPort[0];
if ( $hostAndPort[1] ) {
$port = $hostAndPort[1];
}
if ( $hostAndPort[2] ) {
$socketname = $hostAndPort[2];
}
}
然后修改了对real_connect()的调用以也指定一个套接字
if ( $mysqli->real_connect( $realServer, $this->mUser,
$this->mPassword, $this->mDBname, $port, $socketname, $connFlags ) )