先说一个在PHP开发中看起来不起眼、但一旦踩中就会让你抓狂半小时的问题:用mysqli连接一个非标准端口的MySQL数据库时,到底怎么写才是对的?很多人在这上面翻过车,最后发现不是代码写错了,而是参数传递和主机名解析的“潜规则”在作祟。

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

PHP8.5.5怎样用mysqli连接指定端口数据库

mysqli连接非标端口必须传整数$port参数,且host不能用localhost

在PHP 8.5.5下,用mysqli连一个非默认端口(比如3307、4306),最常犯的错误就是把端口号直接写在host字符串里,写成"localhost:3307"。这种方法看起来挺直观,但框架内部并不会去解析这个冒号——它只会把"localhost:3307"当作一个完整的主机名去查DNS或hosts文件,结果当然是找不到,最终报Connection refused,或者干脆卡住超时。

正确的做法很简单:把端口作为第5个参数传入,而且必须是整数类型。传字符串"3307"会静默失效,系统会忽略它,继续走默认的3306端口。这里还有几个容易忽略的细节:

来看一个具体示例:

$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"的主机,结果自然是找不到。

还有一个更隐蔽的问题:在Linux环境下,localhost会触发Unix socket直连,完全绕过TCP和端口。只有127.0.0.1才会强制走TCP,端口才能起作用。这一点在以下场景中尤为关键:

mysqli_connect() 函数调用时端口位置容易错

过程式写法mysqli_connect()的参数顺序与new mysqli()一致,但新手常犯的错误是漏掉中间参数,导致端口位置错位。

完整签名是:mysqli_connect(host, username, password, dbname, port, socket)。其中socket是可选的第6个参数,一旦传了,第5个参数就不再是端口,而是socket路径——这时候端口就失效了。

连不上时先验证端口和服务状态,别只调代码

PHP报Connection refused或长时间无响应,90%的情况不是代码写错,而是目标端口根本没监听MySQL服务。与其在代码里反复调试,不如先确认一下环境:

端口配置本身并不复杂,难的是排查整个环境链路——host解析、网络通路、MySQL监听、权限绑定,每一层都可能成为绊脚石。掌握这些规律,下次再遇到类似问题,就能少走不少弯路。

本文转载于:https://www.php.cn/faq/2824536.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。