mysqli连接非标端口必须将整数类型端口号作为第5个参数传入,且host必须用“127.0.0.1”而非“localhost”,否则Linux下仍走socket忽略端口;字符串端口如“3307”会静默失效。

mysqli连接非标端口必须传整数$port参数,且host不能用localhost
PHP 8.5.5 中 mysqli 连非默认端口(比如 3307、4306)时,端口不能写在 host 字符串里(如 "localhost:3307"),否则会被当主机名解析,直接连不上。
正确做法是把端口号作为第 5 个参数传入,且必须是整数类型——字符串 "3307" 会静默失效,只走默认 3306。
-
$host必须设为"127.0.0.1"(而非"localhost"),否则 Linux 下仍可能走 socket 文件,端口被忽略 - 前 4 个参数(host/user/pass/db)不能省略;若不指定 db,第 4 参数是 db 名,第 5 才是 port;若指定了 db,port 就是第 5 个
- 如果同时要指定 socket 路径(如
/tmp/mysql.sock),就不能用这种参数式传 port,得切到 PDO
示例:
$host = '127.0.0.1';
$user = 'root';
$pass = '123456';
$db = 'test';
$port = 3307; // ← 整数!不是 "3307"
$mysqli = new mysqli($host, $user, $pass, $db, $port);
if ($mysqli->connect_error) {
die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
为什么localhost:3307会连错
因为 mysqli 构造函数对 host 字符串里的冒号不做端口解析——它只认 mysql:// 风格 URL(但该风格不被原生 mysqli 支持)。写成 "localhost:3307" 实际等价于连一台叫 "localhost:3307" 的主机,DNS 或 hosts 都找不到,最终报 Connection refused 或卡住超时。
立即学习“PHP免费学习笔记(深入)”;
更隐蔽的问题是:Linux 下 localhost 触发 Unix socket 直连,完全绕过 TCP 和端口;只有 127.0.0.1 强制走 TCP,端口才起作用。
- Docker 容器间通信、远程 MySQL、云数据库(如阿里云 RDS)都依赖 TCP,必须用
127.0.0.1 - 开发环境用
localhost看似能连通,上线后换服务器就崩,根源常在这里 - 错误信息里若出现
Can't connect to local MySQL server through socket,说明还在走 socket,没生效端口
mysqli_connect() 函数调用时端口位置容易错
mysqli_connect() 是过程式写法,参数顺序和 new mysqli() 一致,但新手常漏掉中间参数导致 port 错位。
完整签名是:mysqli_connect(host, username, password, dbname, port, socket)。其中 socket 是可选的第 6 个参数,一旦传了,第 5 个就不再是 port,而是 socket 路径——这时 port 就失效了。
- 只传 5 个参数时:
mysqli_connect('127.0.0.1', 'u', 'p', 'db', 3307)→ 第 5 个是 port - 传 6 个参数时:
mysqli_connect('127.0.0.1', 'u', 'p', 'db', 3307, '/tmp/mysql.sock')→ 第 5 个被当成 socket 路径,port 丢失 - 想同时指定 port 和 socket?不行。这种需求请改用 PDO DSN
连不上时先验证端口和服务状态,别只调代码
PHP 报 Connection refused 或长时间无响应,90% 不是代码写错,而是目标端口根本没监听 MySQL 服务。
- 用
telnet 127.0.0.1 3307或nc -zv 127.0.0.1 3307检查端口是否开放 - 确认 MySQL 配置文件(
my.cnf)里bind-address允许127.0.0.1,且port确实设成了你要连的值 - 防火墙(
ufw/iptables/ Windows Defender)可能拦截非标端口,临时关掉测试 - PHP 错误日志里若出现
mysqli::__construct(): Error while reading greeting packet,基本可断定连到了空端口或非 MySQL 服务
端口配置本身很简单,难的是排查环境链路——host 解析、网络通路、MySQL 监听、权限绑定,每层都可能卡住。



















