PHP脚本在Red Hat 8上不能双击运行,也不能像HTML文件那样直接在浏览器里打开。它必须由PHP解释器来执行。具体怎么玩,取决于你当下的场景:是想快速跑个脚本,还是写个定时任务,或者正经部署一个Web服务。

用命令行直接执行(CLI 模式)
这是最直接、最可控的方式,特别适合调试、写数据处理脚本,或者挂到crontab里定时跑。
- 首先确保
php命令能用:敲php -v,如果能输出版本号(比如PHP 8.1.27),那就没问题。如果提示命令找不到,先装一下:dnf install php-cli -y - 进入脚本所在目录,直接运行:
php script.php。如果报错Could not open input file,说明路径不对,先pwd确认当前目录,或者直接用绝对路径:php /path/to/script.php - 想让它像shell脚本一样带执行权限跑?在文件第一行加个shebang:
#!/usr/bin/env php,然后chmod +x script.php,之后就可以直接./script.php了。不过要注意,Windows的CMD/PowerShell不认shebang,所以还是老老实实用php script.php最稳妥。 - CLI模式下默认不显示错误(
display_errors = Off),调试时可以临时加个参数:php -d display_errors=1 script.php,这样错误信息就会直接打出来,非常方便。
用内置服务器快速测试(php -S)
不需要装Apache或Nginx,适合开发阶段快速验证路由逻辑或API接口。
- 执行:
php -S localhost:8000。默认会找当前目录下的index.php;如果想自定义路由,加一个router.php文件:php -S localhost:8000 router.php - 然后在浏览器里访问
http://localhost:8000就能看到效果。不过要记住,这个内置服务器不支持.htaccess、重写规则,并发能力也弱,所以仅限开发环境使用。 - 它只解析当前目录及子目录,不会读取系统级的
php.ini,而是用CLI的配置。想知道当前用了哪个配置文件,可以跑php --ini查看。
通过 Apache 运行 PHP(mod_php 或 php-fpm)
这是生产环境的传统方案,但Red Hat 8默认不再启用 mod_php,推荐用 php-fpm + httpd 的FastCGI模式。
- 先确保安装好:
dnf install httpd php-fpm php-common -y,然后启动服务:systemctl enable --now httpd php-fpm - 配置
/etc/httpd/conf.d/php.conf(如果不存在就新建),加入以下内容,让Apache把.php文件交给PHP-FPM处理:
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
注意这里的路径必须和 /etc/php-fpm.d/www.conf 中的 listen = 一致(默认是 /run/php-fpm/www.sock)。
- 放行防火墙:
firewall-cmd --permanent --add-service=http && firewall-cmd --reload - 把脚本放到
/var/www/html/下,比如test.php,内容写,然后访问http://服务器IP/test.php。如果看到的是源码下载而不是执行结果,说明Apache没把.php交给PHP-FPM,先检查模块是否启用:httpd -M | grep fcgi,看看有没有proxy_fcgi_module。
常见失败现象与定位点
- 浏览器打开
.php文件变成下载:这是Web服务器没识别这个后缀,不是PHP本身的问题,检查上面的FilesMatch配置。 502 Bad Gateway:PHP-FPM没启动,或者fastcgi_pass地址/套接字路径不匹配。503 Service Una vailable:PHP-FPM进程崩溃、内存耗尽,或者pm.max_children设置得太小。Call to undefined function memcached_connect():扩展没装(php-pecl-memcached)或者没启用(检查/etc/php.d/下对应的ini文件)。- CLI和网页输出结果不一致:CLI和FPM加载的是不同的
php.ini。用php --ini和phpinfo()对比一下,就能看出哪里配置不一样。
说到底,真正卡住人的地方,往往不是“PHP怎么装”,而是“哪个配置文件管哪段行为”。所以,别跳过 php --ini 和 phpinfo() 这两步,它们能帮你省下大量排错时间。