PHP 7.4 用 mysqli 连远程 MySQL 失败主因在连接前:需确认 MySQL 允许远程访问、网络可达端口、用户权限授权指定 IP;mysqli 扩展须启用,host 不能写 localhost 而应填 IP 或域名,非默认端口需显式传入,错误信息直接指示故障层级(网络或权限),telnet/nc 可快速验证连通性。

PHP 7.4 用 mysqli 连远程 MySQL,不是改 PHP 版本或写对函数就行——90% 的失败发生在连接发起前。必须确认目标 MySQL 服务端「允许你连」、网络「能通到端口」、用户权限「明确授权你的 IP」,mysqli_connect() 才有机会执行。
检查 mysqli 扩展是否启用(PHP 7.4 环境)
PHP 7.4 默认不强制启用 mysqli,尤其在 Windows 下的 phpEnv 或手动编译环境里容易被忽略:
- 运行
php -m | grep mysqli,无输出说明未加载 - 打开
php.ini(用php --ini查路径),取消注释:extension=mysqli - Windows 用户额外确认
extension_dir指向正确的ext目录,且php_mysqli.dll存在 - 改完重启 Web 服务或 CLI 服务(如 php -S)
mysqli_connect() 连远程库时 host 不能写 localhost
localhost 在 MySQL 客户端协议里是特殊值,强制走 socket 连接,完全绕过 TCP/IP —— 即使远程库装在同一台物理机上,只要不是本地 socket 访问,就必然失败。
- ❌ 错误写法:
mysqli_connect('localhost', $user, $pass, $db) - ✅ 正确写法:用 IP 或可解析域名,例如
mysqli_connect('192.168.1.100', ...)或mysqli_connect('db.example.com', ...) - ⚠️ 如果远程 MySQL 监听非默认端口(如 3307),第 5 个参数必须显式传入:
mysqli_connect($host, $user, $pass, $db, 3307);漏掉就会卡住超时
错误信息直接暴露问题层级
看到报错别急着改 PHP 代码,先看错误类型,它指向完全不同的故障点:
立即学习“PHP免费学习笔记(深入)”;
-
Connection refused:网络层不通。可能是目标服务器防火墙没开 3306、云平台安全组没放行、MySQL 没监听外部地址(bind-address = 127.0.0.1) -
Host '192.168.1.50' is not allowed to connect:MySQL 权限层拒绝。说明网络通了,但用户没授权该 IP,需在 MySQL 服务端执行CREATE USER 'user'@'192.168.1.50'+GRANT+FLUSH PRIVILEGES - 验证网络最简方式:
telnet 192.168.1.100 3306(Windows)或nc -zv 192.168.1.100 3306(Linux/macOS);不通就不用写 PHP 了
完整可用的 mysqli 连接示例(含错误处理)
以下代码假设你已确认 MySQL 服务端配置、网络、权限全部就绪:
<?php
$host = '192.168.1.100'; // 必须是 IP 或域名,绝不能是 localhost
$user = 'app_user';
$pass = 'strong_password';
$db = 'myapp';
$port = 3306; // 显式声明,避免隐式 fallback 失败
$conn = mysqli_connect($host, $user, $pass, $db, $port);
if (!$conn) {
die('连接失败: ' . mysqli_connect_error()); // 不要只 echo,要 die 或 throw
}
// 可选:设置字符集(尤其含 emoji 时)
mysqli_set_charset($conn, 'utf8mb4');
echo "连接成功";
mysqli_close($conn);
?>
真正容易被忽略的是:即使连接成功,mysqli_set_charset() 漏掉也会导致中文或 emoji 插入乱码——它和 DSN 中的 charset=utf8mb4 不等价,必须显式调用。



















