PHP 连接远程 MySQL 数据库服务器,关键就两件事:把连接参数里的 host 换成远程地址,并在远程 MySQL 上给 PHP 所在机器的 IP 授权、放行 3306 端口。 代码本身不复杂,难的是权限、网络和排查顺序,下面按实操路径拆开讲。
PHP连接远程MySQL数据库服务器的三个前提
先别急着改 new mysqli(),连接能不能通,取决于三件事。
远程MySQL要允许外部连接
- 自建 MySQL 检查
bind-address,改为0.0.0或注释掉;确认skip-networking没有开启。 - 云数据库一般不用改配置文件,改白名单即可。
- 改完重启:
systemctl restart mysql或systemctl restart mysqld。 - 验证监听:
ss -lntp | grep 3306,看到0.0.0:3306才算对外监听。
据 MySQL 官方文档,用户授权里的 Host 匹配规则和监听地址,是排查远程连接问题的起点。
给PHP服务器IP单独授权
不要用 图省事,按 IP 授权更稳妥:
CREATE USER 'phpuser'@'203.0.113.25' IDENTIFIED BY '强密码'; GRANT SELECT, INSERT, UPDATE, DELETE ON appdb. TO 'phpuser'@'203.0.113.25'; FLUSH PRIVILEGES;
PHP 服务器出口 IP 不固定,先查出口 IP:curl ifconfig.me,再决定是否用网段,生产环境优先固定 IP 或内网地址。
防火墙和云安全组放行3306
- 本机防火墙:
ufw allow from 203.0.113.25 to any port 3306,或firewalld加 rich rule。 - 云服务器安全组入方向:协议 TCP,端口 3306,源地址填 PHP 服务器 IP。
- 只放行必要来源,别对
0.0.0/0开放,行业共识认为,数据库端口直接暴露公网会增加被扫描风险。
PHP代码怎么写:mysqli和PDO两种连接方式
参数对了,代码就是一层窗户纸。
mysqli写法
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = new mysqli('203.0.113.10', 'phpuser', '强密码', 'appdb', 3306);
$conn->set_charset('utf8mb4');
- 第 1 个参数是远程主机 IP 或域名,不要写
localhost。 - 第 5 个参数显式写端口,省得默认端口被改后连错。
- 打开异常模式,连接失败会直接抛出,不用逐行判断
connect_error。
PDO写法
$dsn = 'mysql:host=203.0.113.10;port=3306;dbname=appdb;charset=utf8mb4';
$pdo = new PDO($dsn, 'phpuser', '强密码', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_TIMEOUT => 5,
]);
ATTR_TIMEOUT设 5 秒,远程网络抖动时别让页面一直等。- 字符集写
utf8mb4,和库表保持一致。
连接参数别写死在代码里
用环境变量或配置文件:
$host = getenv('DB_HOST') ?: '203.0.113.10';
代码进 Git 时密码不泄露,换环境只改配置。
PHP连接远程MySQL数据库失败怎么办:常见报错逐一排查
看到报错先别猜,按报错码定位。
Access denied for user
报错里会带 'phpuser'@'x.x.x.x',看 x.x.x.x 是不是你授权的 IP,不匹配就补授权:
CREATE USER 'phpuser'@'203.0.113.25' IDENTIFIED BY '强密码'; GRANT ALL PRIVILEGES ON appdb. TO 'phpuser'@'203.0.113.25';
密码错也会报 1045,先在本机用命令行验证:
mysql -h 203.0.113.10 -P 3306 -u phpuser -p
Can’t connect to MySQL server on …
常见 2003、10060、1130。
- 2003:端口没通,先
nc -zv 203.0.113.10 3306或telnet 203.0.113.10 3306。 - 10060:超时,多半是安全组或防火墙没放行。
- 1130:MySQL 没给这个来源 IP 授权。
- 如果命令行能连、PHP 不能连,查 PHP 所在机器的出口 IP 和 SELinux 策略。
连接很慢但能连上
MySQL 会对来源 IP 做反向 DNS,加 skip-name-resolve 可减少等待,但授权表里的 Host 要改成 IP 或 ,不能写域名,远程连接延迟通常比本地高,页面里别在循环中反复 new mysqli。
PHP连远程MySQL和本地MySQL的差异对比
本地连 localhost 和远程连 IP,不是换个字符串那么简单。
| 维度 | 本地MySQL | 远程MySQL |
|---|---|---|
| host | localhost/0.0.1 |
公网IP、内网地址或域名 |
| 网络延迟 | 微秒到毫秒 | 通常毫秒级,跨地域更高 |
| 授权 | 本机用户即可 | 必须匹配来源IP |
| 安全 | 不暴露端口 | 要白名单、强密码、必要时TLS |
| 费用 | 一般无额外费用 | 可能涉及实例费、公网流量或带宽 |
性能差异主要来自网络往返
一次查询多次往返,远程延迟会被放大,把多条插入改成批量插入,把循环查询改成一次查询,比换框架更有效。
安全上别偷懒
公网连接建议开 TLS:
$pdo = new PDO($dsn, $user, $pass, [
PDO::MYSQL_ATTR_SSL_CA => '/path/ca.pem',
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
自建 MySQL 可配 require_secure_transport=ON,云数据库在控制台开 SSL 后下载 CA 证书。
简米云服务器PHP连接远程MySQL数据库配置要点
在简米云上,ECS 连 RDS 优先用内网地址,不走公网。
安全组和白名单要对上
- ECS 安全组出方向默认放行,一般不用改。
- RDS 白名单添加 ECS 内网 IP,不是 ECS 公网 IP。
- 同地域用内网地址,跨地域用公网地址或云企业网。
- 测试顺序:ECS 上
mysql -h RDS内网地址 -u 用户 -p,通了再跑 PHP。
别把RDS公网地址当默认选项
公网地址方便本地调试,但生产走内网延迟更低,也少一层暴露面,近年来云厂商对数据库外网访问的管控趋严,能内网就内网。
宝塔面板下PHP连接远程MySQL数据库实操
用宝塔的场景,坑多在面板和系统两层防火墙。
面板放行和系统放行是两回事
- 宝塔“安全”页放行 3306,只影响面板自己的防火墙规则。
- 系统
firewalld/ufw还要单独放行。 - 云服务器还要加安全组。
- 三层都通,端口才真的通。
远程数据库在宝塔上怎么加
宝塔“数据库”页有“添加远程服务器”入口,填远程 IP、端口、用户名、密码,添加后可在 phpMyAdmin 里管理,PHP 代码仍然用远程地址连接,面板只是管理入口。
常见坑
- 宝塔 PHP 默认禁用
proc_open等函数,不影响 mysqli/PDO,但某些 Composer 包会受影响。 - PHP 版本切换后扩展要重装,确认
php -m | grep -E 'mysqli|pdo_mysql'有输出。 - 面板改 MySQL 配置后要重载,别只看页面提示。
PHP连接远程MySQL数据库要花多少钱:费用与选型
不少人搜“php连接远程mysql数据库多少钱”,其实连接动作本身不收费,花钱的是数据库实例和网络。
费用主要在哪
- 云数据库实例:按规格和时长计费。
- 公网地址/公网流量:部分云厂商收流量费或带宽费。
- 自建 MySQL:服务器带宽和运维成本。
- 内网连接:通常不额外收公网流量费,这也是优先内网的原因。
选型建议
- 小项目:PHP 和 MySQL 同机或同内网,成本最低。
- 中型项目:ECS 加 RDS 内网连接,稳定性和备份省心。
- 跨地域:先评估延迟,再决定是否用专线或云企业网。
- 临时调试:用完关公网地址,别长期暴露 3306。
收尾
PHP 连接远程 MySQL 数据库服务器,代码只占一小部分,真正决定成败的是远程授权、端口放行和来源 IP 匹配,把这三层按顺序排完,再写连接代码,排错会快很多。
PHP连接远程MySQL数据库服务器常见问答
PHP连接远程MySQL必须改MySQL配置文件吗?
自建 MySQL 通常要确认 bind-address 和 skip-networking,云数据库一般只改白名单,不改配置文件,先看用的是自建还是托管实例。
为什么命令行能连,PHP却报连接失败?
常见原因是 PHP 进程所在机器的出口 IP 和命令行登录机器不同,或者 PHP 用了 localhost 而不是远程 IP,先打印实际连接参数,再在 PHP 机器上执行 curl ifconfig.me 核对出口 IP。
PHP连接远程MySQL需要开公网吗?
不一定,同地域同账号的 ECS 和 RDS 可用内网地址,延迟更低,也不产生公网流量,只有跨网络调试或本地开发才需要公网地址,用完应及时关闭或加白名单。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/796989.html


