必须从环境、依赖、权限、配置四层穿透式排查:第一步用绝对路径验证真实PHP版本及扩展;第二步检查vendor/autoload.php是否生效;第三步逐项安装并启用simplexml、imagick等关键扩展;第四步修复文件权限,.env须设600;第五步确认Nginx root指向public且SCRIPT_FILENAME参数正确。

PHP 7.3 项目部署后页面空白、500错误或报“Class not found”“undefined function”等,不是改几行代码就能绕过的问题,必须从环境、依赖、权限、配置四层穿透式排查,漏掉任意一层都可能让部署卡在最后一步。
第一步:确认真实 PHP 环境是否就绪
别信宝塔面板右上角显示的“PHP 7.3”,也别信你刚执行过的 php -v 输出——它可能来自另一个 PHP 实例。【必须用绝对路径验证】 找到 Web 服务器实际调用的 PHP 可执行文件路径,通常是 /www/server/php/73/bin/php 或 /usr/bin/php73,然后运行:
/www/server/php/73/bin/php -v && /www/server/php/73/bin/php -m | grep -E 'simplexml|pdo|curl|mbstring'
如果输出中没有 simplexml、pdo_mysql 或 mbstring,说明扩展根本没启用;若版本显示是 7.2.x 或 7.4.x,说明 Nginx/Apache 指向了错误的 PHP-FPM socket,需立刻检查 fastcgi_pass 配置。这一步跳过,后面所有操作都是在错误前提下徒劳重试。
立即学习“PHP免费学习笔记(深入)”;
第二步:检查 vendor 目录是否真正生效
方法一:直接访问 public/index.php 并在开头插入临时诊断代码:
<?php error_reporting(E_ALL); ini_set('display_errors', '1'); var_dump(class_exists('Composer\Autoload\ClassLoader')); exit;
返回 bool(false) 表示 autoload 机制完全未加载,大概率是 vendor/autoload.php 文件缺失或路径错误。
方法二:进入项目根目录,执行:/www/server/php/73/bin/php -d opcache.enable=0 composer dump-autoload --optimize。加 -d opcache.enable=0 是防止 OPcache 缓存了旧的 autoloader 映射,导致新安装的类仍无法识别。
第三步:逐项验证关键扩展是否安装正确
① 报 undefined function simplexml_load_string():运行 yum install php73-php-simplexml(CentOS)或 apt-get install php7.3-xml(Ubuntu),然后重启 php73-php-fpm 服务。注意:仅安装 php-xml 不够,必须匹配 PHP 主版本号前缀,否则 php -m 里依然看不到 simplexml。
② 报 Call to undefined function imagick_open():先确认 ImageMagick 底层库已装(convert -version),再安装对应 PHP 扩展包 php73-php-imagick,最后检查 php.ini 中 extension=imagick.so 是否未被注释且路径正确。
③ 报 getenv("PATH") returns empty:这是宝塔常见问题,在 PHP 配置文件中找到 disable_functions 行,删掉其中的 getenv,保存后重载 PHP 服务。
第四步:校验文件权限与敏感文件保护
运行以下命令一次性修复典型权限问题:
chown -R www:www /var/www/html/ && find /var/www/html/ -type f -exec chmod 644 {} ; && find /var/www/html/ -type d -exec chmod 755 {} ; && chmod 600 /var/www/html/.env
【.env 必须是 600 权限】 如果设成 644,Nginx 日志里会出现 “unable to read .env” 错误,但页面只显示 500,不报具体原因。
第五步:检查 Web 服务器是否正确转发到 index.php
Nginx 配置中 root 必须指向 public 目录,且 location ~ .php$ 块内必须包含 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;。漏掉这一行,PHP-FPM 就会尝试执行 /var/www/html/index.php 而非 /var/www/html/public/index.php,直接导致入口文件找不到。



















