必须用telnet或nc直接测试端口连通性,再用mysql -h 127.0.0.1 -p 3306 -u root -p验证登录;php中localhost走socket无视端口,须用127.0.0.1+显式port参数才生效。

PHP7.4连接MySQL时如何确认是否真连到了3306端口
PHP本身不暴露实际连接的端口,mysqli或PDO连接成功后,你看到的只是“连上了”,但未必连的是你写的那个端口——尤其当配置里写错、环境变量覆盖、或MySQL监听在别处时。得绕过PHP,直接验证底层连通性。
先用命令行工具测,别急着改PHP代码:
-
telnet 127.0.0.1 3306:能连上说明本地3306端口可达;若超时或拒绝连接,说明MySQL没起来、端口被占、或bind-address限制了本地访问 -
mysql -h 127.0.0.1 -P 3306 -u root -p:比telnet多一步认证,能登录就说明服务+权限+端口三者都对;如果报Can't connect to MySQL server,优先查这步,不是PHP问题 - Windows下若telnet未启用,改用
nc -zv 127.0.0.1 3306(需装netcat);Mac/Linux直接用nc或lsof -i :3306看谁在监听
PHP7.4里端口号写在哪?写错会怎样
端口不是独立参数,它依附于主机地址。常见写法有三种,效果不同:
-
$host = 'localhost'→ PHP用Unix socket(不走TCP),无视端口设置;此时port参数无效,mysqli会忽略port=3307 -
$host = '127.0.0.1'→ 强制走TCP,这时port才生效;必须显式传参:new mysqli('127.0.0.1', $user, $pass, $db, 3307) -
$host = 'localhost:3307'→ 在主机字符串里拼端口,PDO DSN也这么写:mysql:host=localhost;port=3307;dbname=test;注意:这里localhost仍可能走socket,保险起见换成127.0.0.1
写错端口最典型现象是mysqli::__construct(): Error while reading greeting packet,不是密码错,是根本收不到MySQL发来的初始握手包。
为什么phpinfo()里看不到当前连接端口
phpinfo()只显示PHP扩展是否加载(如mysqli、pdo_mysql),不记录运行时连接参数。你改了php.ini里的mysqli.default_port,也只是设了个默认值,实际连接仍以代码中传入的为准。
真正影响连接端口的只有两处:
- 代码里
mysqli构造函数第5个参数,或PDODSN中的port=键 - MySQL服务本身监听的端口(查
my.cnf里的port,或运行ss -tuln | grep mysql)
两者不一致,就必然失败。别信“本地开发默认3306”这种说法——phpstudy、XAMPP、Docker镜像都可能改过端口,启动时日志里才有真实值。
远程MySQL连接时端口检查容易漏掉的点
连远程库时,3306不只是PHP要填对,还得层层通关:
- MySQL服务器上
bind-address不能是127.0.0.1(只允许本地),得设成0.0.0.0或具体外网IP - 云服务器安全组/防火墙必须放行
3306(不是80或443),且规则方向是“入站” - PHP所在机器的 outbound 防火墙(如iptables)没拦住出向3306连接
- 用户Host字段得匹配,比如
CREATE USER 'app'@'192.168.1.%',不能只写'app'@'localhost'
其中任意一环卡住,mysql -h 远程IP -P 3306就会直接失败,不用等PHP报错。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











