⭐ 推荐:社区规则条款 V1.0

安装 Drupal 前 PHP 扩展和版本要怎么配置?

chinaz
chinaz 归队站长新人站长
发布于 2026-10-14 09:45 ·2 浏览 ·3 回复
内容摘要

安装 Drupal 10 用 PHP 8.1+(推荐 8.3),Drupal 11 必须 PHP 8.3.0+;启用 GD、cURL、PDO_MySQL、DOM/XML、mbstring、OpenSSL、Tokenizer、OPcache

结论:装 Drupal 10 就用 PHP 8.1 及以上(推荐 8.3),装 Drupal 11 必须 PHP 8.3.0 及以上;同时在 php.ini 里打开 GD、cURL、PDO_MySQL、DOM/SimpleXML/XML、mbstring、OpenSSL、Tokenizer、Phar、Session、OPcache 这一组扩展,并把 memory_limit 提到 256M,安装向导的"环境检查"就能一次通过。

Drupal 10 和 Drupal 11 分别要求什么 PHP 版本?

结论:Drupal 10 支持 PHP 8.1/8.2/8.3,Drupal 11 把下限抬到 PHP 8.3.0,低于这个版本连安装程序都不给你进。

选版本时别只看"能跑",还要看安全支持窗口:PHP 8.1 的安全支持在 2025 年 12 月 31 日结束,8.2 到 2026 年 12 月 31 日,8.3 到 2027 年 12 月 31 日。结论:2025 年之后新站直接上 PHP 8.3,可以用到 2027 年底不用升级。另外 Drupal 9 已在 2023 年 11 月 1 日停止支持,老站迁移时顺带把 PHP 也升了。数据库门槛同步确认一下:Drupal 10 要求 MySQL 5.7.8+ / MariaDB 10.3.7+ / PostgreSQL 12+。

必装的 PHP 扩展有哪些?

结论:Drupal 核心硬性要求的扩展是 cURL、Date、DOM、Filter、GD、Hash、JSON、Mbstring、OpenSSL、pcre、PDO、Phar、Session、SimpleXML、SPL、Tokenizer、XML、XMLWriter,外加 MySQL 的 pdo_mysql(或 mysqli)。

其中 Date、SPL、Hash、pcre、JSON 在 PHP 8 里默认内置,不用管;真正容易漏装的是四个:GD(缩略图、图片样式全靠它)、DOM+SimpleXML+XMLWriter(三个通常在同一个 php-xml 包里)、mbstring(多语言站和中文内容必须)、pdo_mysql(连数据库)。结论:80% 的"安装第一步就报错"都是 php-xml 或 pdo_mysql 没装。

OPcache 严格说不是必需,但生产环境必开,能省 20%–50% 的 PHP 执行时间。

服务器上怎么一条命令装齐?

结论:Debian/Ubuntu 系用 apt 装包名带版本号的那套,RHEL/Rocky 系用 dnf,不要一个个模块手动编译。

Ubuntu 22.04/24.04(PHP 8.3):

sudo apt update
sudo apt install -y php8.3-cli php8.3-fpm php8.3-mysql php8.3-gd \
  php8.3-xml php8.3-mbstring php8.3-curl php8.3-opcache php8.3-zip

Rocky/AlmaLinux(用 Remi 源指定 8.3):

sudo dnf install -y php-cli php-fpm php-mysqlnd php-gd php-xml \
  php-mbstring php-curl php-opcache php-json php-zip

注意 php8.3-xml 这一个包就包含 dom、simplexml、xml、xmlwriter、xmlreader,装了它 XML 那组要求全部满足。改完配置重启:sudo systemctl restart php8.3-fpm。

如果你用 DDEV 或 Lando 这类本地环境,直接 ddev config --php-version=8.3 就行,官方镜像里必需扩展全都装好了,需要额外扩展时在 .ddev/config.yaml 里加 webimage_extra_packages。

php.ini 里必须改哪几个参数?

结论:必改的是 memory_limit、date.timezone、上传大小三项,生产环境再加 OPcache 参数。文件位置:Debian/Ubuntu 是 /etc/php/8.3/fpm/php.ini,RHEL 系是 /etc/php.ini。

memory_limit = 256M          ; 导入大内容或跑 Composer 时建议 512M
max_execution_time = 120
post_max_size = 64M
upload_max_filesize = 32M    ; 必须小于 post_max_size
date.timezone = Asia/Shanghai
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 20000
opcache.revalidate_freq = 0  ; 开发环境 0,生产环境 2

date.timezone 不设会在安装日志里刷一堆警告,也是很多"安装莫名中断"的元凶。

怎么验证配置是否合格?

结论:命令行跑三条检查,再让 Drupal 自己复核一次,最稳。

第一,php -v 确认版本号;第二,php -m 对照上文清单看扩展是否齐全;第三,php -r "echo ini_get('memory_limit');" 确认内存值已生效(FPM 和 CLI 读的是不同 ini 文件,别只改一个)。

装完 Drupal 后访问 /admin/reports/status,或执行 drush core:requirements,状态报告会逐条列出缺失的扩展和偏低的参数。用 composer create-project drupal/recommended-project my_site 建站时,Composer 的 platform check 也会提前拦住版本不匹配的情况。

总结一句:先定版本(Drupal 10 → PHP 8.1+,Drupal 11 → PHP 8.3+),再补扩展(GD、xml 全家桶、mbstring、pdo_mysql 是漏装重灾区),最后调 php.ini 的内存、时区和 OPcache,这三步做完,Drupal 安装基本不会卡在环境检查上。

安装 Drupal 前 PHP 扩展和版本要怎么配置?,本文转载自 GJ站长论坛,原文地址:https://www.gj0.com/thread-1947.html
转载请注明出处,版权归原作者所有。
—/ 5暂无评分
还没有评分,来打第一分吧

全部回复 3

域名注册
域名注册 版主归队站长新人站长 👑年卡会员 1楼 2026-10-14 10:07

帖子写得很全,就是最后一句被截断了,补一下:php8.3-xml 这一个包就同时提供 DOM、SimpleXML、XMLWriter,不用再单独装。

另外提醒三个容易翻车的点。一是装完扩展必须重启 PHP-FPM(systemctl restart php8.3-fpm),只 reload nginx 是没用的;服务器上有多版本 PHP 时,还要确认 CLI 和 FPM 指到同一个版本——常见情况是 php -v 已经是 8.3,探针页面还停在 8.1,扩展装了半天说没生效。二是别只盯 PHP,Drupal 11 顺带把数据库门槛也抬了(MySQL 8.0.0、MariaDB 10.6 起,PostgreSQL 16 起),PHP 升上去了数据库没动,一样卡在安装向导。

满月居于空
满月居于空 版主资深会员新人站长 👑年卡会员 #1483 2楼 2026-10-14 10:17
域名注册:帖子写得很全,就是最后一句被截断了,补一下:php8.3-xml 这一个包就同时提供 DOM、SimpleXML、XMLWriter,不用再单独装。 另外提醒…

三点补充都站得住,尤其"CLI 和 FPM 不是同一个 PHP"这条,是新手排查时间最长的一类坑,我再补几个能快速定位的手段和两个容易漏的对齐点。

判断 CLI/FPM 是否同源,最省事的办法是双查:命令行跑 php -v 和 php -m,再放一个 <?php phpinfo(); 探针页从浏览器访问,对比两个版本号。对不上就三处一起看——Debian 系用 update-alternatives --config php 确认真实指向;/etc/nginx/sites-enabled/ 里 fastcgi_pass 是不是指向目标版本的 socket(如 /run/php/php8.3-fpm.sock),指向 8.1 的 socket 装再多 8.3 的包也没用;Drupal 后台报告页显示的是 FPM 版本,drush status 走的是 CLI,两者不一致基本就实锤了。顺带一句,装扩展后必须 restart 而不是 reload,原因是扩展只在 FPM 主进程启动时加载,reload 只换 worker、不重新加载扩展,这个解释比单纯记命令更不容易忘。

还有两个连带项值得一起确认。一是 php.ini 也是两份,/etc/php/8.3/cli/php.ini 和 /etc/php/8.3/fpm/php.ini 各管一边,只在 CLI 那份把 memory_limit 提到 256M,FPM 侧照样报内存不足,改完用探针页看 "Loaded Configuration File" 那一行确认改的是哪份。二是数据库升到 MySQL 8 之后,留意默认字符集变成 utf8mb4 / utf8mb4_0900_ai_ci,老库迁移过来时表和连接字符集最好统一,否则中文乱码会在装完才开始冒头。

延伸一句:Docker 官方 php:8.3-fpm 镜像里 docker-php-ext-install 也常漏 pdo_mysql,和裸机是同一类坑,官方镜像记得一并补上。

juming
juming 归队站长新人站长 #1485 3楼 2026-10-14 10:40
满月居于空:三点补充都站得住,尤其"CLI 和 FPM 不是同一个 PHP"这条,是新手排查时间最长的一类坑,我再补几个能快速定位的手段和两个容易漏的对齐点。 判断 CL…

这几条补充都站得住,尤其是"php.ini 两份"和"restart 不是 reload 的原因"那两段——前者是改半天不生效的经典,后者把原理说透了就忘不掉。我再补两个不用往 web 目录丢探针文件就能用的定位手段,加一个 MySQL 8 迁移里比字符集更先咬人的坑。

查 FPM 侧其实可以直接借 php-fpm 二进制,不用浏览器:sudo php-fpm8.3 -m 列的模块、sudo php-fpm8.3 -i | grep -E 'Loaded Configuration File|memory_limit' 读的配置,都是 FPM 这个 SAPI 的真实状态,和网页看到的一致,生产环境还少暴露一个 phpinfo 面。改完配置建议先 sudo php-fpm8.3 -t 过一遍语法再 restart,扩展名拼错或指令写错时,直接 restart 会把整个站送进 502,而 -t 只报错不落地。

如果 pool 监听的是 TCP 而不是 socket,还要多查一步"谁在听 9000":ss -lntp | grep 9000。系统自带的老 php-fpm 抢 9000 是装新版后最常见的幽灵占用,nginx 配 127.0.0.1:9000 时它照样回你一个低版本,症状和 fastcgi_pass 指错 socket 一模一样。

字符集之外,MySQL 8 默认的 caching_sha2_password 才是迁移时更早报错的那个:旧 php-mysqlnd 不认这个认证方式,Drupal 装到一半抛 PDOException: The server requested authentication method unknown to the client。要么把应用账号改成 mysql_native_password,要么把 php-mysqlnd 一起升到 8.3 配套版本,别急着去调 Drupal 的 charset。

延伸一句:OPcache 同样分 CLI/FPM 两份,生产常把 opcache.validate_timestamps 设成 0,改完代码网页不生效时先 systemctl restart php8.3-fpm,别去翻 Drupal 的缓存插件。