外网能访问php项目不等于环境搭好,真正卡住的是请求进得来、php能执行、数据库连得上、安全不出事四层漏斗;任一层未对齐,就会出现空白页、502、connection refused或phpinfo页面但业务代码不运行。

外网能访问 PHP 项目,不等于环境搭好了;真正卡住的,是「请求进得来、PHP 能执行、数据库连得上、安全不出事」这四层漏斗。只要其中一层没对齐,浏览器就只会显示空白页、502、Connection refused 或 phpinfo() 页面但业务代码不跑。
Apache + PHP 直接集成时,httpd.conf 必须改这三处
CentOS/RHEL 系统用 yum install httpd php 装完,默认不解析 .php 文件,也不加载模块。光重启服务没用。
-
AddType application/x-httpd-php .php必须追加到/etc/httpd/conf/httpd.conf末尾,否则 Apache 当纯文本返回.php源码 -
DirectoryIndex行要改成DirectoryIndex index.php index.html,不然访问目录时不会自动找index.php -
LoadModule php_module modules/libphp.so这行在新版 httpd 中默认被注释,且路径可能不对;实际路径可用find /usr -name "libphp.so" 2>/dev/null查,然后取消注释并修正
改完必须 systemctl restart httpd,不能只 reload —— mod_php 是静态编译进 httpd 的,reload 不触发模块重载。
PHP 连 MySQL 报 mysqli_connect(): (HY000/2002): Connection refused
这不是密码错,是 PHP 根本没连上 MySQL 进程。常见于:MySQL 绑定 127.0.0.1(IPv4)但 PHP 尝试走 ::1(IPv6),或防火墙拦了 3306。
- 先确认 MySQL 是否监听外网:
ss -tlnp | grep :3306,看到*:3306才表示监听所有接口;若只显示127.0.0.1:3306,需改/etc/my.cnf中的bind-address = 0.0.0.0 - 再检查是否允许远程用户:
mysql -u root -p -e "SELECT host,user FROM mysql.user;",确保对应用户名的host是%或具体 IP,不是localhost - 最后确认防火墙:
firewall-cmd --list-ports看 3306 是否开放;没开就firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload
注意:localhost 在 MySQL 客户端里会强制走 socket 连接,而 127.0.0.1 才走 TCP —— 所以 PHP 代码里写 mysqli_connect('127.0.0.1', ...) 才能真实复现网络链路问题。
用宝塔或 phpstudy 部署 TP6/Laravel 时,runtime 和 .env 权限最容易翻车
框架第一次运行会往 runtime 写缓存、日志;.env 读取失败则全站白屏。但宝塔默认把网站根目录设为 www 用户,而 PHP-FPM 进程可能以 apache 或 nginx 用户运行。
-
runtime目录必须可写:chown -R www:www runtime/(宝塔)或chown -R nginx:nginx runtime/(LNMP) -
.env文件权限不能是 600 —— 某些 PHP 版本下getenv()会因权限太严读不到,建议chmod 644 .env - TP6 的
public目录才是 Web 入口,别把整个项目放/www/wwwroot/xxx,而是放/www/wwwroot/xxx/public,否则路由和静态资源全 404
很多“部署成功但页面空白”的 case,其实只是 runtime/log 下连一个日志文件都没生成出来 —— 先看这个目录有没有被创建,比查 Nginx 错误日志更快定位。
没有公网 IP 时,nat123 或 frp 映射后仍无法访问的真因
内网穿透工具只解决「外网能连到你本地 80 端口」,但不保证「你的 PHP 服务真在监听那个端口」或「它愿意响应外网请求」。
- Apache/Nginx 默认只监听
127.0.0.1:80,需显式改成0.0.0.0:80或删掉Listen后的 IP 限定 - PHP-FPM 若配置了
listen.allowed_clients = 127.0.0.1(默认值),则 frp 转发来的请求会被直接拒绝,必须删掉或改成0.0.0.0 - 某些路由器开启 UPnP 后,nat123 可能映射到错误的内网 IP(比如 Docker 容器 IP),实际应映射到宿主机的物理网卡 IP(
ip a | grep inet查)
最简单的验证方式:在另一台局域网电脑上,用内网 IP + 端口直连(如 http://192.168.1.100:8080),能通才说明服务本身没问题;如果局域网都打不开,就别急着调穿透工具。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











