ThinkPHP8在ARM服务器连接MySQL的核心是确保PHP及mysqli扩展运行于aarch64原生环境、修复libtinfo.so版本链接问题、将MySQL认证插件改为mysql_native_password、hostname必须用127.0.0.1、php.ini启用mysqli并设默认字符集,且database.php中显式配置charset=utf8mb4。

ThinkPHP8 在 ARM 架构服务器上连接 MySQL,核心不是“编译 MySQLi 驱动”,而是确保 PHP 环境中 已正确启用并兼容原生的 mysqli 扩展。ARM 平台下该扩展通常随系统 PHP 二进制包一同提供,无需手动编译;若需自编译或遇到连接异常,关键点集中在架构适配、依赖链接与 MySQL 协议兼容性三方面。
确认 PHP 和 mysqli 扩展运行在 aarch64 原生环境
ARM 服务器必须运行 aarch64 架构的 PHP(非 armv7l),否则即使启用了 mysqli,底层调用也会因指令集不匹配而静默失败或崩溃:
- 执行
php -v和php -m | grep mysqli,确认输出正常且无“segmentation fault” - 检查 PHP 架构:
php -r "echo PHP_BINARY . PHP_EOL;"→ 再对路径执行file /usr/bin/php,输出应含aarch64 - 若使用 apt 安装的 php-mysql 包,务必确认其架构为
arm64(如 Ubuntu/Debian 中运行dpkg -l | grep php-mysql,看第二列是否为arm64)
修复 libtinfo.so 版本链接问题(常见启动/连接卡死原因)
ARM 发行版(如 Debian 12、Ubuntu 22.04+)默认提供 libtinfo.so.6,但部分 PHP 扩展或 MySQL 客户端库仍硬编码依赖 libtinfo.so.5,导致 mysqli 初始化时动态链接失败,表现为 mysqli_connect(): (HY000/2002): Connection refused 或进程直接退出:
- 先验证缺失:运行
ldd $(php-config --extension-dir)/mysqli.so | grep tinfo,若显示libtinfo.so.5 => not found即为该问题 - 临时解决:
sudo ln -s /usr/lib/aarch64-linux-gnu/libtinfo.so.6 /usr/lib/aarch64-linux-gnu/libtinfo.so.5 - 更稳妥方式:用
patchelf重写扩展依赖(需先安装 patchelf):sudo patchelf --replace-needed libtinfo.so.5 libtinfo.so.6 $(php-config --extension-dir)/mysqli.so
确保 MySQL 服务端协议与 PHP 驱动兼容
TP8 连接失败报 Access denied 或 authentication method unknown,90% 源于 MySQL 8.0+ 默认插件 caching_sha2_password 不被旧版 mysqli 库识别(尤其某些 ARM 编译的 PHP 未更新 OpenSSL/BoringSSL 支持):
- 登录 MySQL 命令行,执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_pass';FLUSH PRIVILEGES; - 在 TP8 的
config/database.php中,hostname必须写'127.0.0.1'(不可用'localhost'),避免 mysqli 尝试 Unix socket 而绕过 TCP 认证协商 - 验证是否生效:用原生脚本测试(非 TP8):
<?php $c = mysqli_connect('127.0.0.1','root','your_pass','test',3306); var_dump($c); ?>
配置文件与字符集显式声明不可省略
ARM 平台常运行轻量发行版(如 Armbian、Debian for RPi),其默认 php.ini 可能未启用 mysqli 或未设默认字符集,导致中文乱码或预处理失败:
- 检查
php.ini中以下两行未被注释:extension=mysqlimysqli.default_charset = utf8mb4 - 在 TP8 的
database.php连接配置中,必须显式指定:'charset' => 'utf8mb4'(仅靠 php.ini 不足以保证 PDO/mysqli 初始化阶段生效) - 若使用 Docker 部署 PHP + MySQL,确保两个容器都拉取
arm64v8/或linux/arm64标签镜像,避免跨架构通信异常



















