前言

该记录主要是自己安装Matomo时,因之前我的PHP在编译安装时未启用安装zlib库,导致Matomo无法进一步安装,遂决定给自己的PHP重新编译安装下,顺便升级下PHP版本。

于是乎开始了编译之旅,在编译时,自己根据最新的PHP的编译参数又额外添加了几个参数。好在编译一切成功,最后PHP也成功升级安装,Matomo也没了报错,最终成功安装。

接下来,把Matomo一顿倒腾好后,打开Zabbix查看下服务器情况,发现Zabbix图形界面中文乱码了(大大的疑惑??),如下图:

image-20220831191658235

因为自己之前已经替换过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)即可。

image-20220831194954656

三处都需要修改,无需重启Zabbix服务,刷新页面即可解决。最后进Zabbix发现图形的中文已正常显示:

image-20220831195243973

End

本文标题:记一次因PHP编译安装导致的Zabbix中文乱码

本文链接:https://www.isisy.com/1319.html

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

声明:转载请注明文章来源。

最后修改:2022 年 08 月 31 日
如果觉得我的文章对你有用,请随意赞赏