必须启用epel与remi仓库并安装php-fpm及pdo_mysql、mbstring等扩展,否则web服务将返回源码或502错误;需区分cli与fpm的php.ini路径,改错配置无效,且必须systemctl restart php-fpm生效。

直接装 php 命令行能跑,但 Web 服务大概率返回源码或 502 错误——因为缺 php-fpm、关键扩展和正确的配置路径。别跳过仓库启用和模块选择,否则装出来的是 PHP 5.4 或 7.2,连 Laravel 9 都起不来。
先确认系统版本和启用对应仓库
CentOS 7 和 CentOS 8+ 的包管理器、仓库结构、PHP 模块机制完全不同,混用命令必失败。
- 查版本:
cat /etc/centos-release或rpm -q centos-release - CentOS 7:必须装 EPEL + Remi 源(
yum install epel-release→ 下载并安装remi-release-7.rpm),否则yum install php只给 PHP 5.4 - CentOS 8/9:用
dnf,先装 EPEL 和 Remi rpm:dnf install epel-release https://rpms.remirepo.net/enterprise/remi-release-8.rpm -y,再执行dnf module reset php && dnf module enable php:remi-8.2(或remi-8.3) - 验证是否生效:
dnf module list php输出里要有带[e]标记的 stream,比如php:remi-8.2 [e]
安装 PHP 运行时 + FPM + 必装扩展
只装 php 包,CLI 能用,但 Nginx/Apache 无法处理请求;不装 php-mysqlnd,PDO 连 MySQL 直接报 Class 'PDO' not found;漏 php-mbstring,Laravel 启动就挂。
- CentOS 8/9 推荐命令(含 FPM 和生产必需扩展):
dnf install -y php-fpm php-cli php-mysqlnd php-curl php-gd php-mbstring php-xml php-opcache php-zip php-bcmath - CentOS 7 对应命令:
yum install -y php-fpm php-cli php-mysqlnd php-curl php-gd php-mbstring php-xml php-opcache php-zip php-bcmath - 验证扩展加载:
php -m | grep -E "(mysqlnd|mbstring|opcache)"—— 每个词都应有输出 - 注意:
php-mysql已废弃,必须用php-mysqlnd;php-fpm在 CentOS 8+ 是独立包,不装它,Web 服务根本没法通信
改 php.ini 前先搞清哪个文件真生效
php --ini 显示的是 CLI 环境的配置路径,Nginx + PHP-FPM 用的是另一套——改错地方,display_errors = On 写十遍也没用。
- 查 CLI 配置:
php --ini | grep "Loaded Configuration File" - 查 FPM 实际加载的 ini:
php-fpm -t后看日志,或运行ps aux | grep php-fpm找主配置文件,再检查其中include_path指向的目录(通常是/etc/php.d/) - 常见坑:
/etc/php.d/10-opcache.ini里可能有display_errors = Off,它会覆盖/etc/php.ini里的设置 - 改完重启服务:
systemctl restart php-fpm(不是httpd或nginx)
启动 php-fpm 并验证 Web 解析是否正常
光服务 running 不代表 PHP 脚本能执行——Nginx 配置没连对 socket、SELinux 拦着、权限不对,都会导致 502 或空白页。
- 启动并开机自启:
systemctl enable --now php-fpm;验证状态:systemctl is-active php-fpm应返回active - 确认监听方式:默认是 Unix socket(
/run/php-fpm/www.sock),Nginx 的fastcgi_pass必须匹配;若改过listen = 127.0.0.1:9000,则 Nginx 也要同步改 - 测试脚本放在 Web 根目录(如
/usr/share/nginx/html/info.php),内容为<?php phpinfo(); ?> - 访问前确保 SELinux 允许:
setsebool -P httpd_can_network_connect 1(Nginx 场景);防火墙放行 80 端口
最常被跳过的其实是仓库启用和 FPM 配置路径验证——很多人卡在“页面显示源码”,其实只是 Nginx 没把请求转发给 php-fpm,而不是 PHP 没装好。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











