PHP-FPM日志亂碼的根本原因通常是字符集不匹配(如日志文件編碼與查看工具編碼不一致)。首先需確保系統環境的字符集為UTF-8(Linux系統默認多為UTF-8,可通過locale
命令驗證):
locale
若未設置為UTF-8,需修改系統區域配置(如/etc/locale.conf
),添加或修改以下內容:
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
修改后執行source /etc/locale.conf
使配置生效。
PHP-FPM的日志格式(如訪問日志、錯誤日志)需正確配置,避免因格式錯誤導致亂碼。主要修改www.conf
(路徑通常為/etc/php/{版本號}/fpm/pool.d/www.conf
):
access.format
和access.log
的注釋,指定日志路徑及格式(示例):access.format = "%h %t \"%m %r\" %>s %b" # 記錄客戶端IP、時間、請求方法、URI、狀態碼、響應大小
access.log = /var/log/php-fpm/access.log
php_admin_value[error_log]
和php_admin_flag[log_errors]
的注釋,指定錯誤日志路徑(示例):catch_workers_output = yes # 捕獲worker進程輸出(可選,但有助于排查問題)
php_admin_value[error_log] = /var/log/php-fpm/error.log
php_admin_flag[log_errors] = on
修改后保存文件。
使用file
命令檢查日志文件的實際編碼(如/var/log/php-fpm/error.log
):
file -i /var/log/php-fpm/error.log
若輸出結果中包含charset=iso-8859-1
(或其他非UTF-8編碼),需重新生成日志文件(刪除舊文件后重啟PHP-FPM,或手動寫入UTF-8編碼的空文件):
rm -f /var/log/php-fpm/error.log
touch /var/log/php-fpm/error.log
echo "" > /var/log/php-fpm/error.log # 確保文件為空且為UTF-8編碼
chown www-data:www-data /var/log/php-fpm/error.log # 修改文件所有者(根據實際用戶調整,如nginx用戶)
若PHP-FPM進程未繼承系統環境變量(如LANG
),可能導致日志編碼異常??赏ㄟ^修改www.conf
設置環境變量:
env[LANG] = en_US.UTF-8
env[LC_ALL] = en_US.UTF-8
修改后重啟PHP-FPM使配置生效。
完成上述配置后,重啟PHP-FPM以應用更改(根據系統版本選擇對應命令):
# Ubuntu/Debian(systemd)
sudo systemctl restart php{版本號}-fpm # 如php7.4-fpm、php8.2-fpm
# CentOS/RHEL(SysVinit)
sudo service php-fpm restart
查看日志文件內容(如/var/log/php-fpm/error.log
),確認是否仍有亂碼:
tail -f /var/log/php-fpm/error.log
若仍存在亂碼,可嘗試使用iconv
工具轉換日志文件編碼(如將ISO-8859-1轉為UTF-8):
iconv -f iso-8859-1 -t utf-8 /var/log/php-fpm/error.log -o /var/log/php-fpm/error_utf8.log
通過以上步驟,可逐步排查并解決PHP-FPM日志亂碼問題。核心邏輯是確保字符集一致性(系統環境、日志配置、文件編碼),并通過正確配置日志格式和路徑避免亂碼產生。