PHP不能双击或直接打开运行,必须通过命令行(php script.php)或Web服务器(如Apache/Nginx+PHP-FPM)执行;否则仅显示源码。关键前提是虚拟机中已安装对应版本PHP解释器、CLI模块、Web服务器模块,并正确配置路径、权限与服务关联。

直接说结论:不是“打开 PHP 文件”就能运行,而是必须让虚拟机里有 PHP 解释器 + 可执行环境。你双击 test.php 或用文本编辑器打开,它只会显示源码——要真正执行,得走命令行或 Web 服务两条路。
php 命令行执行失败:找不到 php 或版本不对
这是最常见卡点。虚拟机里没装 PHP,或者装了但没加进 PATH,或者装的是旧版(比如系统默认的 PHP 7.4),而你的代码用了 match、enum 等 PHP 8+ 语法。
- 先确认是否安装:在终端运行
php -v,如果报command not found,说明根本没装 - Ubuntu/Debian 下装 PHP 8.2:运行
sudo apt update && sudo apt install php8.2-cli php8.2-mbstring php8.2-xml - CentOS/RHEL 9+:用
sudo dnf install php-cli php-mbstring php-xml(默认是 PHP 8.1+) - 装完再试
php -v,输出应含8.2.x或更高;若仍是旧版,可能系统自带老 PHP 没被覆盖,需手动切换:sudo update-alternatives --config php
Apache 能启动但访问 .php 文件显示源码不执行
说明 PHP 模块没加载进 Apache,或者没启用对应模块。浏览器直接看到 <?php echo 'hi'; ?> 这种原始代码,就是典型症状。
- Ubuntu/Debian:检查是否装了
libapache2-mod-php8.2(不是只装php8.2-cli) - 启用模块:
sudo a2enmod php8.2,然后sudo systemctl restart apache2 - 确认
/etc/apache2/mods-enabled/下有php8.2.load和php8.2.conf - 测试文件必须放对位置:
/var/www/html/test.php,且内容是<?php phpinfo(); ?>,不能漏掉<?php开头
Nginx + PHP-FPM 配置后 502 Bad Gateway
这基本等于 Nginx 找不到正在运行的 PHP-FPM 进程,或者 socket 路径不一致。
立即学习“PHP免费学习笔记(深入)”;
- 先确保 PHP-FPM 在跑:
sudo systemctl status php8.2-fpm(注意服务名带版本号) - 查监听方式:
sudo cat /etc/php/8.2/fpm/pool.d/www.conf | grep listen,常见值是listen = /run/php/php8.2-fpm.sock或listen = 127.0.0.1:9000 - Nginx 配置里
fastcgi_pass必须和上面完全一致,比如:fastcgi_pass unix:/run/php/php8.2-fpm.sock; - 权限问题常被忽略:socket 文件属主是
www-data,Nginx worker 进程也得是www-data用户,否则连不上
文件权限和路径写错导致 403 或 500 错误
尤其是把项目直接丢进 /var/www/html/ 后访问出错,八成是权限或路径惹的祸。
-
403 Forbidden:Web 服务器没权限读目录,运行sudo chown -R www-data:www-data /var/www/html/your-project -
500 Internal Server Error:可能是index.php里 require 的路径错了,比如硬编码/home/user/project,但在虚拟机里实际路径是/var/www/html/project - 别用绝对路径写死——改用
__DIR__或dirname(__FILE__)动态获取当前脚本所在目录 - 共享文件夹(如 VirtualBox Guest Additions)挂载点权限混乱,建议用
cp -r复制到/var/www/html/再操作,别直接在共享目录里跑
最易被忽略的一点:PHP 版本小版本差异(比如 8.2.10 vs 8.2.15)通常不影响运行,但扩展缺失(如没装 php8.2-curl)会导致 curl_init() 直接报错;还有 php.ini 里 display_errors = Off 会让错误静默消失,调试时务必设为 On 并配合 error_log 查日志。



















