ubuntu 22.04 默认 apt install php 安装的是 php 8.1,需添加 ppa:ondrej/php 源后显式安装 php8.2 及对应扩展(如 php8.2-mbstring),并按 web 服务器类型选择 libapache2-mod-php8.2(apache)或 php8.2-fpm(nginx),配置与服务须严格匹配对应环境。

装 PHP 不是执行一条 apt install php 就完事——版本错、扩展漏、CLI 和 FPM 配置混用、Web 服务器根本没挂上 PHP 处理器,这些才是导致白屏、下载 .php 文件、Call to undefined function mb_strlen() 的真实原因。
怎么确认该装哪个 PHP 版本
别默认信系统仓库的“最新版”。Ubuntu 22.04 的 apt install php 装的是 PHP 8.1,但 Laravel 11 要求 ≥8.2,WordPress 某些插件依赖 php8.2-mbstring 却不会自动装。
- 先查你用的框架或 CMS 明确要求的最低版本(比如 Laravel 11 → PHP ≥8.2)
- 显式安装带版本号的包:
sudo apt install php8.2 php8.2-cli php8.2-mysql php8.2-mbstring php8.2-xml php8.2-zip - 装完立刻验证:
php -v看版本,php -m | grep mbstring确认扩展真加载了 - 如果系统已有旧版,用
sudo update-alternatives --config php切换默认php命令指向
Apache 下 PHP 不解析 .php 文件
页面直接显示源码,或浏览器弹出下载对话框,说明 Apache 根本没把 .php 当作可执行脚本处理。
- 确认模块已安装:
libapache2-mod-php8.2(Debian/Ubuntu),不是php8.2-fpm—— 后者是给 Nginx 用的 - 检查模块是否启用:
ls /etc/apache2/mods-enabled/php8.2.load,不存在就运行sudo a2enmod php8.2 - 确保站点配置里有明确处理器声明,例如在
<virtualhost></virtualhost>内加:<filesmatch><br> SetHandler application/x-httpd-php<br></filesmatch>
- 重启 Apache:
sudo systemctl restart apache2(注意是restart,不是reload;后者不重载模块加载顺序)
PHP-FPM 启动失败:No such file or directory
错误日志里出现 ERROR: unable to bind listening socket for address '/run/php/php8.2-fpm.sock': No such file or directory,这不是配置写错了,是路径父目录压根不存在或权限不对。
- 检查
/etc/php/8.2/fpm/pool.d/www.conf中的listen =路径是否与实际一致(常见于镜像或手动编译后路径不匹配) - 手动创建缺失的父目录:
sudo mkdir -p /run/php,再设权限:sudo chown www-data:www-data /run/php - 启动前先测试配置语法:
sudo php-fpm8.2 -t,比systemctl start更早暴露 ini 或 conf 文件里的拼写错误 - 确认服务已启用:
sudo systemctl enable php8.2-fpm,否则 reboot 后不自启
php.ini 修改后不生效
phpinfo() 显示的 “Loaded Configuration File” 和你编辑的 /etc/php/8.2/cli/php.ini 往往不是同一个文件——CLI 和 Web 环境(FPM/Apache)加载的是两套独立配置。
- 查 CLI 加载路径:
php --ini - 查 Web 环境实际路径:
php -i | grep "Configuration File"(在phpinfo()页面里也看得到) - 修改对应环境的 ini:FPM 用
/etc/php/8.2/fpm/php.ini,Apache 用/etc/php/8.2/apache2/php.ini - 改完必须重启对应服务:
sudo systemctl restart php8.2-fpm或sudo systemctl restart apache2,光 reload 不够
最常被跳过的一步:改完 php.ini 后,只跑 php -v 看版本,却没用 phpinfo() 在浏览器里确认 Web 环境是否真的读到了新配置——CLI 和 FPM 是两个进程,各自加载自己的 ini,这点不厘清,所有调优都白忙。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











