PHP扩展安装与网站配置生效检查

“扩展已经安装,但网站仍提示缺失”常见原因是改错PHP版本或只检查了命令行环境。本文以Ubuntu 24.04、PHP 8.3 FPM为例,先确认网站使用的处理器,再安装扩展和调整配置。面板管理的网站应在面板里操作,不混用发行版包修改面板自带PHP。

记录网站实际使用的PHP

php -v
php --ini
systemctl status php8.3-fpm --no-pager
ls -l /run/php/

以上前两条只说明默认CLI配置。网站可能连接另一FPM池或另一个PHP版本;先从Nginx fastcgi_pass或Apache FPM处理配置找到对应服务。Ubuntu发行版的8.3 CLI常使用/etc/php/8.3/cli,FPM常使用/etc/php/8.3/fpm,这两个目录不能混为一谈。

按程序要求安装扩展

例如程序明确需要数据库、国际化、字符处理、图片和压缩功能,可安装对应版本的软件包。没有需求的扩展不用为了“环境齐全”全部安装。

sudo apt update
sudo apt install php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl php8.3-gd php8.3-zip php8.3-intl
sudo php-fpm8.3 -t
sudo systemctl reload php8.3-fpm

包管理或FPM配置检查有报错时先处理,不能只看安装输出末尾没有红字。若使用不同PHP分支,应更换整组包名与服务名,不能把8.3扩展加载进另一个大版本。

修改当前FPM的配置文件

打开/etc/php/8.3/fpm/php.ini,找到已有指令并修改,不在文件末尾反复追加同名设置。以下只是一个单文件16MiB上传的示例,不是所有网站的统一推荐:

upload_max_filesize = 16M
post_max_size = 20M
memory_limit = 128M
display_errors = Off
log_errors = On

post_max_size限制整个POST请求,应比单文件限制留出空间;还要考虑应用本身、Nginx/CDN及多文件上传限制。memory_limit是单脚本允许使用的内存,不是整台服务器的总限制。不能仅靠把所有参数调到很大解决程序内存泄漏或慢请求。保存后先执行php-fpm8.3 -t,成功后reload对应FPM。

只对本机展示必要检测项

先核对目标站点的真实root或DocumentRoot。以下假设已确认的测试站根目录为/var/www/baole-demo,且不存在同名文件。运行sudo nano /var/www/baole-demo/baole-php-env-check.php,在该新文件中填入下方内容并保存。它只允许来自本机直连地址的请求,不提供完整phpinfo;有反向代理的环境需先理解REMOTE_ADDR的含义,不能将检测页暴露到公网。

<?php
if (!in_array($_SERVER['REMOTE_ADDR'] ?? '', ['127.0.0.1', '::1'], true)) {
    http_response_code(403); exit;
}
header('Content-Type: text/plain; charset=utf-8');
echo PHP_VERSION, ' ', PHP_SAPI, "\n";
foreach (['upload_max_filesize', 'post_max_size', 'memory_limit'] as $name) {
    echo $name, '=', ini_get($name), "\n";
}
foreach (['mysqli', 'mbstring', 'curl', 'gd', 'zip', 'intl'] as $ext) {
    echo $ext, ':', extension_loaded($ext) ? 'yes' : 'no', "\n";
}

在服务器本机执行以下命令,将example.com换成该站点真实域名。域名必须与目标server配置一致,路径对应刚创建的文件;HTTP阶段只读取本例无凭据的有限环境信息,不用于登录或发送密码。

curl --resolve example.com:80:127.0.0.1 http://example.com/baole-php-env-check.php

已经只开放HTTPS的站点,使用对应443入口检查,证书必须有效,不加-k:

curl --resolve example.com:443:127.0.0.1 https://example.com/baole-php-env-check.php

记录网站返回的版本与配置,检查实际需要的扩展为yes;不是在同一站点同时运行两条命令来绕过既定访问方式。外部请求该文件应被拒绝,若没有被拒绝则先控制访问并检查代理及访问规则。测试结束,仅删除本次创建的检查文件:

sudo rm -- /var/www/baole-demo/baole-php-env-check.php

再从同一入口请求应已无法得到检测内容。CLI结果和FPM结果不同并不稀奇,应继续找真正影响网站的配置,不能为了一致而随意切换其他站点的运行版本。

仍未生效时检查什么

  • 确认reload的是目标FPM分支,并检查服务日志有没有加载扩展失败。
  • 查看池配置、conf.d、.user.ini或程序运行时设置是否覆盖了php.ini;不是每个参数都允许在所有层级修改。
  • 使用容器或多台后端时,分别确认每个实际处理请求的实例,避免只改了其中一台。
  • 配置回退时恢复本次修改前的文件和参数,检测后reload;不要直接卸载当前程序依赖的PHP扩展。