在 CentOS 上 PHP 日志出现乱码,通常不是 PHP 本身“坏了”,而是字符编码不一致或输出环境编码不对导致的。下面按常见原因逐一说明,并给出解决办法。
如果你的 PHP 文件保存为 GBK / GB2312,但系统或日志按 UTF-8 解读,就会乱码。
排查:
file -i your_script.php
解决:
PHP 默认不一定输出 UTF-8。
检查 php.ini:
default_charset = "UTF-8"
或在代码中:
mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
CentOS 终端默认可能是 LANG=zh_CN.GBK。
查看当前编码:
echo $LANG
解决:
export LANG=zh_CN.UTF-8
# 或
export LANG=en_US.UTF-8
并确认:
locale
error_log() 写文件时,编码取决于:
建议写法:
error_log(mb_convert_encoding('中文日志', 'UTF-8', 'auto'));
或统一使用英文日志,避免中文。
charset utf-8;
AddDefaultCharset UTF-8
如果日志里记录的是数据库内容,而数据库是 GBK:
SHOW VARIABLES LIKE 'character_set%';
解决:
mysqli_set_charset($conn, 'utf8');
# 1. 系统语言
locale
# 2. PHP 文件编码
file -i test.php
# 3. PHP 编码设置
php -i | grep default_charset
# 4. 日志文件编码
file -i /var/log/php_errors.log
CentOS 上 PHP 日志乱码,90% 是“文件编码 / 系统 LANG / PHP 默认编码”三者不一致造成的。
如果你愿意,可以把:
php -vecho $LANG发给我,我可以帮你精准定位。