thinkphp6在macos m1上连接数据库的核心是确保php与pdo扩展架构一致(同为arm64或x86_64),并正确启用对应扩展(如pdo_mysql)、验证pdo::getavailabledrivers()含目标驱动,同时database.php中type小写、pg需设params异常模式、禁用utf8 charset。

在 macOS M1 芯片上让 ThinkPHP6 正常连接数据库,核心不是“装 TP6”,而是确保底层 PHP 环境已正确加载对应的 PDO 扩展(如 pdo_mysql、pdo_pgsql 或 pdo_sqlite)。M1 的关键挑战在于架构一致性——PHP 解释器、扩展、依赖库必须同为 arm64(原生)或同为 x86_64(Rosetta 2 转译),混用会直接报“incompatible architecture”错误。
确认当前 PHP 架构与来源
先弄清你用的是哪个 PHP:系统自带?Homebrew 安装?还是 XAMPP/MxSrvs 等集成环境?不同来源对应不同路径和架构。
- 运行
php -v和php --ini,看版本号和Loaded Configuration File路径 - 运行
file $(which php),输出含arm64表示原生,含x86_64表示转译 - Homebrew 安装的 PHP(推荐)默认在
/opt/homebrew/bin/php,是 arm64 原生 - XAMPP/MxSrvs 内置 PHP 多为 x86_64,需用
arch -x86_64 /path/to/php启动才能匹配其扩展
安装并启用对应 PDO 扩展
扩展必须与 PHP 架构一致。Homebrew 安装 PHP 时,常用扩展通常已预编译好,只需启用;若缺失,再单独安装。
部署和使用军舰的 macOS Automator 自动化服务集合。包含 5 个实用工作流:PDF转JPG、PNG重命名并转JPG、图像拼接、解压RAR、顺序命名图像文件。一键安装所有服务到 ~/Library/Services/ 目录。使用场景:(1) "安装我的自动化服务",(2) "部署所有 Automato...
- MySQL:运行
brew install php@8.3(以 8.3 为例)后,pdo_mysql和mysqli已内置,只需检查php.ini中是否取消注释:extension=pdo_mysql和extension=mysqli - PostgreSQL:运行
brew install postgresql+brew install php@8.3,然后确认php.ini含extension=pdo_pgsql;再用php -r "print_r(PDO::getAvailableDrivers());"验证输出含pgsql - SQL Server(sqlsrv):M1 原生支持有限,推荐用
pecl install pdo_sqlsrv(需先装 Microsoft ODBC Driver for SQL Server),但更稳方案是 Docker 运行 Linux 容器执行 PHP - SQLite:Homebrew PHP 默认已启用
extension=pdo_sqlite和extension=sqlite3,基本无需额外操作
验证扩展是否真正生效
光看 php -m | grep pdo 不够,PDO 驱动必须被 PDO 层识别到。
- 执行
php -r "print_r(PDO::getAvailableDrivers());",输出数组中必须包含你要用的驱动名(如mysql、pgsql、sqlite) - 创建一个
info.php文件,内容为<?php phpinfo(); ?>,用浏览器访问,搜索 “pdo” 和对应驱动,确认“enabled”且配置路径正确 - 重启 Web 服务(如
brew services restart httpd或重启 Apache/Nginx)
TP6 配置要点(避开常见坑)
扩展装好了,TP6 还可能因配置细节失败,尤其在 M1 上调试信息容易被静默吞掉。
- MySQL/PostgreSQL 连接时,
database.php中不要写'charset' => 'utf8'(PG 不认,MySQL 应用utf8mb4) - PostgreSQL 必须显式加
'params' => [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION],否则错误不报、查询返回空 - Docker 场景下,
'hostname'填容器名(如db),不是localhost(那是指 PHP 容器自己) - 确保
config/database.php中'type'小写准确(mysql、pgsql、sqlite),大小写错会 fallback 到 MySQL 驱动










