php连接远程mysql的核心是先配置mysql服务端允许远程访问:1. 修改bind-address为0.0.0.0并重启服务;2. 创建限定ip的远程用户并授权;3. 开放防火墙及云平台3306端口;4. php代码中使用公网ip而非localhost或域名,并指定charset=utf8mb4。

PHP 连接远程 MySQL,核心不是改代码,而是先让 MySQL 服务器“愿意被连”——否则 mysqli_connect() 或 PDO 再怎么填对 IP 和密码,也只会报 Host 'x.x.x.x' is not allowed to connect。
MySQL 服务端必须开放远程访问权限
默认安装的 MySQL 只监听 127.0.0.1,意味着它拒绝所有外部 IP 的连接请求。这不是 PHP 的问题,是 MySQL 自身配置锁死的。
- 编辑 MySQL 配置文件(常见路径:
/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/my.cnf),找到bind-address行,改为:bind-address = 0.0.0.0 - 重启服务:
sudo systemctl restart mysql(或mysqld,依系统而定) - 检查是否生效:
sudo netstat -tlnp | grep :3306—— 输出中应包含*:3306,而非127.0.0.1:3306
必须创建带远程主机限定的数据库用户
用 root@localhost 登录后直接改 user 表的 host 字段为 % 是最常见也最危险的做法。GCP、腾讯云等平台的安全组甚至会直接拦截这种宽泛授权。
- 不要执行
UPDATE user SET host = '%' WHERE user = 'root' - 应显式创建新用户,例如允许来自 PHP 应用服务器 IP
203.0.113.45的连接:CREATE USER 'app_user'@'203.0.113.45' IDENTIFIED BY 'strong_password'; - 再授权:
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'app_user'@'203.0.113.45'; - 最后刷新:
FLUSH PRIVILEGES;
防火墙与云平台安全组是实际拦路虎
很多调试卡在“能 ping 通但连不上”,大概率是 3306 端口被挡在了最后一道门之外。
- 本地服务器防火墙(如
ufw)需放行:sudo ufw allow 3306 - GCP 实例:在控制台进入“VPC 网络 → 防火墙规则”,新增入站规则,目标为该实例,协议 TCP,端口 3306,源 IP 设为 PHP 服务器 IP 或最小必要范围
- 腾讯云 CVM:对应“安全组”,添加入站规则,端口 3306,源 IP 同上
- 验证端口是否可达:
telnet your-mysql-ip 3306或nc -zv your-mysql-ip 3306
PHP 代码里别写死 localhost,但也不要盲目信 DNS
DBHOST 填 localhost 在远程场景下永远失败;填域名看似优雅,但一旦 DNS 解析慢或失败,PDO 连接会卡住几秒才超时,且错误信息不明确。
- 直接使用 MySQL 服务器的**公网 IPv4 地址**(如
34.123.45.67),避免中间环节 - DSN 中务必指定
charset=utf8mb4,否则中文可能乱码:mysql:host=34.123.45.67;dbname=mydb;charset=utf8mb4 - 连接后立即测试连通性:
try { $pdo->query("SELECT 1"); } catch (PDOException $e) { die($e->getMessage()); }
真正卡住人的,往往不是 new PDO() 这一行写得对不对,而是 MySQL 没监听外网、用户没授权给真实客户端 IP、或者云平台安全组根本没开 3306 入站——这三个点漏掉任何一个,代码都白调。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











