PHP 7.2 配置 Unix Socket 分为数据库连接和 PHP-FPM 通信两部分:mysqli/PDO 需指定 socket 路径且主机设为空,PHP-FPM 需配置 listen 为 sock 文件并设正确权限,Nginx 对应调整 fastcgi_pass。

在 PHP 7.2 中配置 Unix Socket 主要涉及两个层面:一是让 PHP 的 mysqli 或 PDO 扩展通过 Unix Socket 连接 MySQL(或 MariaDB),二是确保 Web 服务器(如 Nginx + PHP-FPM)使用 Unix Socket 与 PHP 进程通信。两者常被混淆,下面分开说明关键配置点。
PHP 连接 MySQL 使用 Unix Socket
默认情况下,PHP 使用 TCP(localhost 或 127.0.0.1)连接数据库。若想走 Unix Socket,需显式指定 socket 路径,且不能用 localhost(它会触发 TCP 回环)。
- 用
mysqli时,把主机设为'null'或留空,并传入socket参数:
$mysqli = new mysqli(null, 'user', 'pass', 'db', null, '/var/run/mysqld/mysqld.sock');
- 用
PDO时,在 DSN 中指定unix_socket:
$pdo = new PDO('mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=db', 'user', 'pass');
- 确认 MySQL 实际 socket 路径:登录 MySQL 执行
SELECT @@socket;,常见路径有/var/run/mysqld/mysqld.sock、/tmp/mysql.sock等 - PHP 进程需有读取该 socket 文件的权限(通常属组
mysql,需将 web 用户如www-data加入该组)
PHP-FPM 与 Web 服务器通过 Unix Socket 通信
这是提升性能和安全性的常见做法,替代默认的 TCP(如 127.0.0.1:9000)。
- 编辑 PHP-FPM 池配置(如
/etc/php/7.2/fpm/pool.d/www.conf),修改listen行:
listen = /run/php/php7.2-fpm.sock
- 设置 socket 权限,确保 Web 服务器用户可访问:
listen.owner = www-data<br>listen.group = www-data<br>listen.mode = 0660
- 重启 PHP-FPM:
sudo systemctl restart php7.2-fpm - Nginx 配置中对应调整
fastcgi_pass:
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
验证是否生效
不要只看配置文件,实际检查更可靠:
立即学习“PHP免费学习笔记(深入)”;
- 运行
ss -l | grep php或ls -l /run/php/确认 socket 文件存在且权限正确 - 查看 PHP-FPM 错误日志(
/var/log/php7.2-fpm.log)有无 bind 或 permission 报错 - 在 PHP 脚本中打印
php_sapi_name()和ini_get('mysqli.default_socket')辅助调试 - 用
strace或lsof -i观察进程真实连接方式(较进阶)
常见问题速查
遇到连接失败,优先排查这几点:
-
路径不一致:PHP-FPM 的
listen路径必须和 Nginx 的fastcgi_pass完全一致(包括大小写和符号链接) -
权限不对:socket 文件属主/属组需匹配 Nginx 工作进程用户(通常是
www-data),否则 502 错误 - SELinux/AppArmor:某些系统启用安全模块后会阻止 socket 访问,临时禁用可测试是否为此原因
-
MySQL socket 被禁用:检查 MySQL 配置
skip-networking是否开启(它会关闭 TCP,但 Unix Socket 仍可用);若bind-address = 127.0.0.1且没配socket,也可能影响



















