首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

macOS 升級後 PHP 無法連接 MySQL Socket 問題修復

     編輯:MySQL 綜合教學

macOS 升級後 PHP 無法連接 MySQL Socket 問題修復

macOS 升級(如 10.10 Yosemite)後,PHP 連接 MySQL 报錯:

No such file or directory - /tmp/mysql.sock

原因:**PHP/MySQL 客戶端默認尋找 /tmp/mysql.sock,但 macOS(或 Homebrew/MySQL 官方包)實際將 Socket 放在 /var/run/mysqld/mysqld.sock 或 /tmp/mysql.sock 不存在**。

根因分析

  • MySQL 服務端啟動時根據 my.cnf 中 [mysqld] socket=... 創建 Socket 文件。
  • PHP 客戶端(PDO_MYSQL、mysqli)編譯時或運行時讀取默認 Socket 路徑(通常硬編碼為 /tmp/mysql.sock)。
  • 路徑不一致導致連接失敗。

解決方案對比

方案一:創建軟鏈接(最快、最通用)

# 確認實際 Socket 位置
ls -l /var/run/mysqld/mysqld.sock
# 或
mysql_config --socket

# 創建鏈接指向 PHP 預期路徑
sudo ln -sf /var/run/mysqld/mysqld.sock /tmp/mysql.sock

優點: 即時生效,無需修改 PHP 代碼或配置,適用所有客戶端工具。
缺點: 重啟後 /tmp 可能被清理,需加入啟動腳本或使用方案二。

方案二:修改 PHP 配置文件指定 Socket(推薦持久化)

編輯 php.ini(php --ini 查看路徑):

[Pdo_mysql]
pdo_mysql.default_socket = /var/run/mysqld/mysqld.sock

[MySQLi]
mysqli.default_socket = /var/run/mysqld/mysqld.sock

重啟 PHP-FPM/Apache 生效。

方案三:統一 MySQL 配置文件 Socket 路徑

編輯 /etc/my.cnf 或 /usr/local/etc/my.cnf:

[client]
socket = /tmp/mysql.sock

[mysqld]
socket = /tmp/mysql.sock

重啟 MySQL 服務。風險: /tmp 臨時目錄可能被系統清理,生產環境建議指定持久目錄(如 /var/lib/mysql/mysql.sock)並同步修改 PHP 配置。

方案四:連接字符串顯式指定(代碼層面)

$pdo = new PDO("mysql:host=localhost;dbname=test;unix_socket=/var/run/mysqld/mysqld.sock", 'user', 'pass');

驗證修復

php -r "new PDO('mysql:host=localhost;dbname=mysql', 'root', ''); echo 'OK';"

避坑指南

  • 多 MySQL 實例: 每實例 Socket 路徑不同,PHP 須按實例區分配置。
  • Homebrew 安裝: Socket 通常在 /tmp/mysql.sock 或 /opt/homebrew/var/mysql/mysql.sock (M1 晶片)。
  • 權限問題: 確保 PHP 進程用戶(如 _www)有讀寫 Socket 目錄權限。

**「軟鏈接應急 + php.ini 顯式指定持久化」** 是 macOS 開發環境的黃金組合,升級系統後只需檢查鏈接是否存活即可。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved