php通过unix socket连接mysql可提升性能与安全性,需确认socket路径、配置pdo/mysqli参数、确保php进程权限,并在docker中显式挂载socket文件。

PHP 通过 Unix Socket 连接 MySQL(或 MariaDB)是一种高效、安全的本地通信方式,适用于 Web 服务与数据库同处一台服务器的场景。它绕过 TCP/IP 协议栈,减少网络层开销,同时避免端口暴露和防火墙配置问题。
确认数据库支持并启用 Unix Socket
MySQL 默认开启 Unix Socket 支持,监听路径通常为 /var/run/mysqld/mysqld.sock 或 /tmp/mysql.sock。可通过以下命令验证:
mysql -u root -p -S /var/run/mysqld/mysqld.sock
若连接成功,说明 Socket 文件存在且可访问。如失败,检查 MySQL 配置文件(my.cnf)中 socket 选项位置,并确保 skip-networking 未启用(否则禁用 TCP,但 Unix Socket 仍可用)。
PHP 中使用 PDO 或 MySQLi 指定 Socket 路径
不依赖 host=127.0.0.1(这会走 TCP),而是显式指定 unix_socket 参数:
立即学习“PHP免费学习笔记(深入)”;
citySHOP是一款集CMS、网店、商品、分类信息、论坛等为一体的城市多用户商城系统,已完美整合目前流行的Discuz! 6.0论坛,采用最新的5.0版PHP+MYSQL技术。面向对象的数据库连接机制,缓存及80%静态化处理,使它能最大程度减轻服务器负担,为您节约建设成本。多级店铺区分及联盟商户地图标注,实体店与虚拟完美结合。个性化的店铺系统,会员后台一体化管理。后台登陆初始网站密匙:LOVES
- PDO 方式(推荐):
$dsn = 'mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=testdb;charset=utf8mb4';
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
- MySQLi 面向对象方式:
$mysqli = new mysqli(null, $user, $pass, 'testdb', null, '/var/run/mysqld/mysqld.sock');
注意:MySQLi 构造函数中,host 设为 null 或空字符串,port 设为 null,才能触发 Unix Socket 模式;第 6 个参数传入 sock 路径。
权限与路径一致性是关键
PHP 进程(如 www-data、nginx 或 php-fpm 用户)必须对 Socket 文件及其父目录有读写权限。常见问题包括:
- Socket 文件属主为 mysql:mysql,但 PHP 运行用户无法访问 /var/run/mysqld/ 目录
- SELinux 或 AppArmor 限制了跨进程 socket 访问(Linux 发行版如 CentOS/RHEL、Ubuntu 可能默认启用)
- PHP-FPM 的 security.limit_extensions 或 chroot 设置导致路径解析异常
临时排查可尝试:sudo -u www-data mysql -S /var/run/mysqld/mysqld.sock -e "SELECT 1;",确认运行用户能否直连。
在 Docker 或容器化环境中适配 Socket 路径
宿主机与容器间共享 Unix Socket 需挂载路径并保持一致:
- 启动 MySQL 容器时,用 -v /host/path/mysqld.sock:/var/run/mysqld/mysqld.sock
- PHP 容器中 DSN 使用相同路径(如 /var/run/mysqld/mysqld.sock),并确保挂载后权限匹配
- 更稳妥做法是让 MySQL 容器暴露 TCP 端口(如 3306),PHP 容器通过容器名连接(如 mysql:3306),除非对性能有极致要求
Unix Socket 在容器间不是天然共享机制,需显式绑定,且容易因路径、权限、生命周期(如 MySQL 启动慢于 PHP)引发连接失败。










