PHP连接数据库服务器地址,本质上就是告诉PHP代码,MySQL服务跑在哪一台机器的哪个端口上,这个地址由host(主机名或IP)和port(端口号)两部分组成,默认端口是3306,填错任何一个,PHP都找不到数据库。
很多新手在配置数据库连接时,把注意力全放在用户名和密码上,结果地址填错,折腾半天也连不上,服务器地址这个参数,恰恰是决定连接能否成功的第一个关卡,下面从常见的几种使用场景出发,把地址该怎么填、填错了怎么排查,一次说清楚。
php连接mysql数据库服务器地址填什么
先记住一个核心结论:PHP连接MySQL,地址不是PHP文件所在的位置,而是MySQL服务监听的网络位置。 这个位置由host和port共同决定,在PHP代码里通常写成下面这样:
$host = '127.0.0.1'; // 服务器地址 $port = 3306; // 端口 $user = 'root'; $pass = '123456'; $db = 'test'; $conn = new mysqli($host, $user, $pass, $db, $port);
也可以使用PDO:
$pdo = new PDO('mysql:host=127.0.0.1;port=3306;dbname=test', $user, $pass);
host填什么,取决于MySQL跑在哪台机器上,下面是几种典型场景的对照。
| 场景 | host填什么 | 端口默认值 |
|---|---|---|
| 本地开发环境 | 0.0.1 或 localhost |
3306 |
| 同一台云服务器上的PHP和MySQL | 0.0.1 或内网IP |
3306 |
| PHP和MySQL在不同服务器 | MySQL所在服务器的公网IP或内网IP | 3306 |
| Docker容器间互联 | 容器名或虚拟网络IP | 3306 |
| 使用phpstudy集成环境 | 0.0.1 |
3306 |
本地开发:localhost和127.0.0.1到底填哪个
本地开发时,大多数人的选择是localhost或0.0.1,但这两个写法有细微差别。0.0.1强制走TCP/IP协议连接,而localhost在多数情况下会优先尝试使用Unix Socket连接,只有Socket不可用时才转向TCP,对PHP本身来说,两者都能连上本机的MySQL,但如果你在配置文件中把bind-address设成了0.0.1,MySQL只监听这个IP,此时填localhost可能因为走Socket而出现”Connection refused”。
行业共识是:本地环境一律写0.0.1,避免因Socket和TCP行为不一致产生奇怪的问题。
云服务器上:php连接数据库服务器地址怎么填
PHP代码跑在云服务器A上,MySQL跑在云服务器B上,这是常见的分部署部署方式,这种情况下,host要填MySQL服务器B的IP地址,至于是填公网IP还是内网IP,要看两台服务器是否在同一私有网络内。
- 同地域、同一VPC内:优先填内网IP,速度快且不占用公网带宽。
- 跨地域或不同VPC:填公网IP,同时必须在安全组中放行3306端口。
- 使用云数据库RDS:填RDS控制台提供的内网或公网连接地址,这个地址通常是一串域名,直接作为host填入即可。
这里有一个容易踩的坑:MySQL默认只监听0.0.1,也就是只允许本机连接。 如果你在服务器B上装好MySQL后直接拿公网IP去连,大概率报错Connection refused,必须在MySQL配置中修改bind-address为0.0.0或内网IP,让它对外监听。
用phpstudy时数据库服务器地址怎么填
phpstudy是国内使用率很高的集成环境,很多站长用它搭建WordPress或其他PHP程序,当PHP程序要求填写数据库服务器地址时,多数情况下填0.0.1:
- PHP和MySQL都在同一台机器上运行,填
0.0.1最保险。 - phpstudy内置的MySQL默认端口为3306,如果被占用,可能被改成3307或其他端口,此时要在程序配置里同步修改端口号。
- 如果MySQL装的是phpstudy,但PHP程序跑在另一台机器上,同样需要修改phpstudy中MySQL的
bind-address,并开放防火墙。
php连接不上数据库服务器地址的常见原因
连不上的原因五花八门,但归结起来就几类,按照下面这些方向去排查,比瞎猜快得多。
连接被拒绝(Connection refused)
出现这个报错,意味着PHP发出的连接请求根本没有到达MySQL的监听端口,常见原因:
- MySQL服务没有启动。
bind-address限制了监听地址,比如只监听0.0.1,你却在代码里填了公网IP。- 端口不是默认的3306,代码里没填对端口。
- 防火墙或安全组拦截了3306端口的入站请求。
排查命令:在PHP所在机器上执行telnet 目标IP 3306,如果显示连接失败,基本可确认是网络层或服务层问题。
密码正确但拒绝访问(Access denied)
Access denied for user这个报错和地址的关系很大,但很多人误以为是密码错了。MySQL的用户权限是”用户名+来源主机”绑定的。
例如root@localhost只允许root从本机连接,你从远程主机用root去连,即使密码正确也会被拒绝。
查看MySQL用户表:
SELECT user, host FROM mysql.user;
如果host字段是localhost,就只允许本机登录,解决方法是创建一个允许远程访问的用户:
CREATE USER 'wordpress'@'%' IDENTIFIED BY '你的密码'; GRANT ALL PRIVILEGES ON wordpress_db. TO 'wordpress'@'%'; FLUSH PRIVILEGES;
表示允许任意主机连接,出于安全考虑,更稳妥的做法是指定具体IP,例如'wordpress'@'192.168.1.100'。
连接超时(Connection timed out)
超时通常意味着请求发出去了,但目标机器没有响应,多数情况下是防火墙拦截,或者是目标IP根本不通,在云服务器环境下,最容易遗漏的是安全组规则,云服务商的安全组相当于服务器最外层的防火墙,即使你在系统内部用firewalld或iptables放行了3306,安全组没放行一样连不上。
地址填对但PHP报错不支持
如果你在PHP代码里写的是mysql_connect()这类老函数,会直接报Call to undefined function,原因很简单:PHP 7.0以后移除了mysql扩展,只有mysqli和PDO能用。 这不是地址问题,而是代码写法问题,改用mysqli_connect($host, $user, $pass, $db, $port)即可。
php连接数据库服务器地址的排查实操
当连接失败时,按照下面的顺序排查,能快速定位问题出在哪一层。
- 第一步:确认MySQL在跑。 登录MySQL所在服务器,执行
systemctl status mysql或ps aux | grep mysql,确认服务进程存在。 - 第二步:确认MySQL监听端口。 执行
netstat -tlnp | grep 3306,查看监听地址是0.0.0:3306还是0.0.1:3306,如果是后者,说明只允许本机连接。 - 第三步:测试网络连通性。 在PHP所在机器执行
ping 目标IP,能通再执行telnet 目标IP 3306。 - 第四步:检查账号来源限制。 用命令行尝试登录:
mysql -h 目标IP -P 3306 -u 用户名 -p,如果命令行能连上而PHP连不上,问题大概率出在PHP代码里的host或port填写错误。 - 第五步:查看PHP错误日志。 日志里会明确写出是哪一步出的问题,比盯着屏幕猜靠谱得多。
用配置文件管理数据库服务器地址
把数据库服务器地址直接硬编码在PHP文件里,带来的麻烦是:换服务器、换环境时,你得逐个文件修改,更好的做法是把地址放到独立配置文件中统一管理。
// config.php
return [
'db_host' => '127.0.0.1',
'db_port' => 3306,
'db_user' => 'webuser',
'db_pass' => 'strong_password',
'db_name' => 'app_db',
];
然后在项目入口加载:
$config = require 'config.php';
$pdo = new PDO(
'mysql:host=' . $config['db_host'] . ';port=' . $config['db_port'] . ';dbname=' . $config['db_name'],
$config['db_user'],
$config['db_pass']
);
这种做法在部署上线时特别方便,本地开发填0.0.1,测试环境填测试库地址,生产环境填生产库地址,只改配置文件一处,不影响业务代码,相当一部分企业级PHP框架,如Laravel、Symfony,都默认采用环境变量或配置文件来管理数据库连接参数,原因就在于此。
php连接数据库服务器地址的常见问题解答
Q:localhost能连上数据库,改成服务器公网IP就连不上,是什么原因?
A:MySQL默认只监听0.0.1,没有对外监听公网IP,需要在my.cnf或my.ini中修改bind-address=0.0.0.0,同时确认用户表中存在允许来自远程主机的用户记录,且防火墙和云安全组放行了3306端口。
Q:PHP连接数据库时报Access denied,但密码确认无误,怎么处理这个问题?
A:检查MySQL用户表中的host字段,例如root用户host为localhost,从远程连接时会被拒绝,使用一条GRANT语句为你的IP或授权,然后执行FLUSH PRIVILEGES刷新权限,错误信息中会明确显示被拒绝的用户名和来源主机IP,按提示调整即可。
Q:PDO和mysqli在数据库服务器地址写法上有什么区别?
A:本质相同,都是指定host和port,只是格式不同,mysqli使用函数参数分别传入主机、用户名、密码等;PDO在DSN字符串中用host=xxx;port=xxx表示,两者填错地址时,报错信息也都是类似php_network_getaddresses: getaddrinfo failed或Connection refused这类网络层错误。
数据库服务器地址是PHP连接MySQL的第一道门槛,掌握host的填写逻辑,理解0.0.1与公网IP在访问权限上的差异,再配合系统的排查流程,绝大多数的连接失败问题都能在几分钟内解决。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/720420.html





