我在共享主机服务器上安装了MediaWiki。它的版本是1.19.1,我正在尝试更新到1.22.2。该文档表明,对于此,一步更新应该没问题。
我已经多次成功完成过去的更新,并且按照之前的说明进行操作。我在其中设置了一个包含1.22.2的新目录,将LocalSettings.php
和/images/
文件从工作的实时目录复制到新目录。 LocalSettings.php
包含$wgDBuser
,$wgDBpassword
,$wgDBadminuser
和$wgDBadminpassword
全部定义的条目。
我有命令行访问服务器,并试图通过
在WikiNew中运行更新过程php maintenance/update.php
但它回应:
DB connection error: Unknown MySQL server host 'localhost:/tmp/mysql5.sock' (34) (localhost:/tmp/mysql5.sock)
如果我在WikiLive中也这样做,那就有效。当然它没有做任何实际的更新,因为我正在更新1.19.1到1.19.1,但是通常的消息类型出现但有迹象表明不需要更改,并且它会清除缓存。 LiviWiki,1.19,仍然有效。
因此连接字符串的相同数据存在于LocalSettings.php的两个副本中,maintenance/update.php
的两个副本都访问相同的MySQL数据库,但是一个接受连接字符串而另一个不接受。
1.19和1.22之间有什么变化吗?我在1.20,1.21和1.22的发行说明中查找了“配置更改”,但没有看到任何更改的说明。
请帮忙!
谢谢。
答案 0 :(得分:2)
对于记录,答案是从
更改数据库主机$ wgDBserver =“localhost:/tmp/mysql5.sock”
到
$ wgDBserver =“localhost”
原始字符串应该有效,但MediaWiki 1.19.2中有一个错误,如下所述:
https://bugzilla.wikimedia.org/show_bug.cgi?id=58153
“1.22.0中的新mysqli适配器无法正确实现非标准MySQL 端口“。
答案 1 :(得分:0)
我遇到了类似的问题,区别在于我使用的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 )
,它接受连接字符串并解析它,将其分解为函数{{real_connect()
调用的必要部分。 1}}位于相关文件夹中的DatabaseMysqli.php文件中包含/ db。
protected function mysqlConnect( $realServer )
中的我将函数修改为以下内容:
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()