现象
报 PHP Fatal error: Uncaught Error: Call to undefined function curl_init(),或 Class "App\Services\Mailer" not found;浏览器只返回 500 没有细节;同一份代码在一台服务器正常、另一台失败。
诊断
先做语法检查并打开完整错误输出:
php -l app/Services/Mailer.php
php -d display_errors=1 -d error_reporting=E_ALL -d log_errors=0 app/index.php
php -m | grep -i curl
php -r "var_dump(class_exists('App\\Services\\Mailer'));"
php -l 能直接指出语法错误行;第二条会打印未捕获错误的文件与行号,而不是空白 500。php -m 列出当前 SAPI 加载的扩展,CLI 与 FPM 可能读取不同的 php.ini。class_exists 返回 false 说明自动加载无法把命名空间映射到文件。
再确认错误日志位置与权限:
php -i | grep -E 'error_log|display_errors|log_errors'
tail -n 50 /var/log/php/error.log
修复
缺少函数时安装并启用对应扩展,例如 sudo apt-get install php8.3-curl 后重载 FPM。类找不到时按 PSR-4 对齐命名空间与路径,并重新生成自动加载:
composer dump-autoload -o
文件应位于 app/Services/Mailer.php 且声明 namespace App\Services;,composer.json 中 App\\ 映射到 app/;Linux 区分大小写,不能依赖本地文件系统的大小写不敏感。类型错误应在边界处修正值,而不是盲目强制转换。
验证
重新请求失败路由,确认返回正常而不是 500;检查错误日志没有新的 fatal 记录,并在与生产扩展一致的容器中运行测试。生产环境保持 display_errors=Off、log_errors=On,否则下一次致命错误仍然只会留下一个无信息的 500。