前言
该记录主要是自己安装Matomo时,因之前我的PHP在编译安装时未启用安装zlib库,导致Matomo无法进一步安装,遂决定给自己的PHP重新编译安装下,顺便升级下PHP版本。
于是乎开始了编译之旅,在编译时,自己根据最新的PHP的编译参数又额外添加了几个参数。好在编译一切成功,最后PHP也成功升级安装,Matomo也没了报错,最终成功安装。
接下来,把Matomo一顿倒腾好后,打开Zabbix查看下服务器情况,发现Zabbix图形界面中文乱码了(大大的疑惑??),如下图:
因为自己之前已经替换过Zabbix的显示字体,且该字体是支持中文的,于是重启了Zabbix,发现依旧,便联想到了问题出现在了PHP上。
分析
接下来就对PHP的相关参数进行分析,经过多方排查,最终定位到一个参数上,在我给PHP重新编译安装时,我添加的--enable-gd-jis-conv
成了罪魁祸首,原因是在编译PHP时启用--enable-gd-jis-conv
选项的话,那么非ASCII字符(例如汉字、拼音、希腊文和箭头)会被当成EUC-JP编码(PHP说明中美其名曰“支持JIS编码的字体”), 从而导致乱码(由于西文字体没有假名或汉字,一般表现为全部是方框)。imagettftext()
函数是将字符写入到图片的函数,这个问题就是由这个函数导致的。
解决
接下来就是解决Zabbix字体乱码了,自己也在网上找了很多教程,发现都不是那么管用或偏离了相关配置。下面从一些偏门教程中经过自己相关实践测试,成功解决了中文乱码。
方法一:
这个方法无他,就是重新编译安装PHP,取消--enable-gd-jis-conv
参数即可。
方法二:
该方法需要修改Zabbix的相关文件了,下面为我所修改的:
先来到Zabbix站点目录下,找到include/graphs.inc.php
文件(修改前先备份文件),在文件最后面添加如下代码:
//解决PHP开启--enable-gd-jis-conv参数导致图形中文乱码
function to_entities($string){
$len = strlen($string);
$buf = "";
for($i = 0; $i < $len; $i++){
if (ord($string[$i]) <= 127){
$buf .= $string[$i];
} else if (ord ($string[$i]) <192){
//unexpected 2nd, 3rd or 4th byte
$buf .= "?";
} else if (ord ($string[$i]) <224){
//first byte of 2-byte seq
$buf .= sprintf("&#%d;",
((ord($string[$i + 0]) & 31) << 6) +
(ord($string[$i + 1]) & 63)
);
$i += 1;
} else if (ord ($string[$i]) <240){
//first byte of 3-byte seq
$buf .= sprintf("&#%d;",
((ord($string[$i + 0]) & 15) << 12) +
((ord($string[$i + 1]) & 63) << 6) +
(ord($string[$i + 2]) & 63)
);
$i += 2;
} else {
//first byte of 4-byte seq
$buf .= sprintf("&#%d;",
((ord($string[$i + 0]) & 7) << 18) +
((ord($string[$i + 1]) & 63) << 12) +
((ord($string[$i + 2]) & 63) << 6) +
(ord($string[$i + 3]) & 63)
);
$i += 3;
}
}
return $buf;
}
然后找到该文件中的imagettftext()
函数(一共三处),将最后一个参数$string
修改为to_entities($string)
即可。
三处都需要修改,无需重启Zabbix服务,刷新页面即可解决。最后进Zabbix发现图形的中文已正常显示:
2 条评论
鸽了好久了,今天就水一篇吧→_→