MacOS M1 Pro下Laravel报SQLSTATE[HY000][2002]连接错误求助
M1 Mac 数据库连接报
SQLSTATE[HY000] [2002] Bad file descriptor 修复方案 该错误极少由驱动缺失导致,核心诱因是M1架构下双架构重复安装、MAMP PRO与Homebrew环境混装引发的三类问题:PHP运行架构与扩展架构不匹配、MySQL socket路径配置错位、多MySQL实例端口冲突,按以下步骤逐一排查即可解决:
1. 修复架构匹配问题
- 终端执行
arch确认当前运行环境:返回arm64为原生ARM模式,返回i386为Rosetta 2转译的x86模式 - 对应架构下执行
php -i | grep pdo_mysql,如果无pdo_mysql扩展相关返回,说明扩展未正确加载:- 若使用MAMP PRO自带PHP,将MAMP对应PHP版本的bin路径追加到shell配置文件(
~/.zshrc或~/.bashrc)最顶部,保证其优先级高于Homebrew、系统自带PHP,配置完成后执行source ~/.zshrc重载配置 - 重新执行pdo_mysql检查命令,确认扩展正常加载后再进行后续操作
- 若使用MAMP PRO自带PHP,将MAMP对应PHP版本的bin路径追加到shell配置文件(
- 不要同时运行MAMP PRO自带MySQL和Homebrew版MySQL:执行
lsof -i :3306查看3306端口占用进程,关闭非当前使用环境的MySQL进程,禁用其开机自启项,避免端口抢占。
2. 修复socket路径错位问题
90%的该类报错由PHP配置的socket路径与MySQL实际生成的socket路径不一致导致:
- 执行
sudo find /tmp /var/mysql /opt/homebrew/var/mysql /Applications/MAMP/tmp/mysql -name "mysql.sock",记录返回的真实socket文件路径 - 执行
php --ini找到当前加载的php.ini文件路径,修改文件中以下三个配置项,值统一替换为上一步查到的真实socket路径:
mysql.default_socket = /你查到的真实/mysql.sock路径 mysqli.default_socket = /你查到的真实/mysql.sock路径 pdo_mysql.default_socket = /你查到的真实/mysql.sock路径
- 快速绕过socket问题的方案:项目数据库配置中不要将数据库主机设为
localhost(localhost配置下PHP会默认走Unix socket连接,路径错误直接触发报错),改为127.0.0.1强制走TCP连接 - 配置修改完成后重启对应PHP服务:MAMP PRO环境直接在面板点击重启,Homebrew环境执行
brew services restart php即可。
3. 权限问题兜底修复
如果上述操作完成后仍报错,按以下步骤排查权限问题:
- 执行
ls -la /你查到的真实/mysql.sock路径,确认PHP运行用户(通常为_www或当前登录用户)对socket文件有读写权限 - 执行
sudo chmod 1777 /tmp放开临时目录权限,避免MySQL无法正常生成socket文件 - 双架构重复安装过环境的场景,执行
brew cleanup清理残留旧文件,MAMP PRO可直接在面板操作重置MySQL权限、重建socket文件。
验证方式:不要直接运行原有项目,先新建临时测试脚本排除项目缓存干扰:
<?php // 配置为你本地实际的数据库账号密码 $pdo = new PDO('mysql:host=127.0.0.1;dbname=mysql;charset=utf8mb4', 'root', '你的数据库密码'); var_dump($pdo->query('SELECT 1')->fetch());
如果脚本正常返回结果,说明环境配置无误,清理原有项目的配置缓存(如Laravel执行php artisan config:clear)即可正常运行。
内容的提问来源于stack exchange,提问作者Luigi Esposito
相关产品推荐
相关产品推荐

