DirectAdmin安装多个PHP版本详细教程-CustomBuild配置与域名独立切换
近期PHP官方发布了一轮紧急安全更新,修复了两个可能导致远程代码执行的漏洞。对站长来说,麻烦的地方在于:PHP需要及时更新,服务器上的旧WordPress、论坛和历史程序却未必能马上换到新分支。有几个网站共用一台主机时,直接改默认PHP,很可能让原本正常的站点打不开。
最近一台DirectAdmin主机在原有PHP 8.1、8.2之外,已经补装了php3、php4。多版本可以先给适配好的网站使用新PHP,旧站单独安排迁移。不过php3不是PHP 8.3的固定叫法,它只是第三个槽位,具体装的什么版本,要查看CustomBuild配置,不能按编号猜。
挖站否以前介绍过DirectAdmin多PHP和缓存设置,这次把新版面板的安装、开启选择器、域名及子域名切换重新整理一下。有不少的朋友说要使用PHP8.3和PHP8.4,趁着这次升级PHP,干脆就把DirectAdmin免费PHP空间给升级了,现在大家可以在DirectAdmin后台看到PHP选项了。
更多的关于DirectAdmin和网站管理的文章,这里还有:
- DirectAdmin安装多个PHP版本,配置Nginx和brotli压缩以及备份至FTP
- DirectAdmin空间启用OpCache和redis缓存加速-WP启用redis缓存
- DirectAdmin免费PHP空间启用Redis缓存加速和网站每日备份与恢复
一、PHP漏洞
2026年10月21日的两份PHP官方通告分别是:CVE-2026-109618,内存耗尽处理中的异常状态可能造成内存破坏;CVE-2026-109619,请求结束后残留的全局状态可能引用已释放内存。符合触发条件时,攻击者可能以Web工作进程的权限执行代码。Apache mod_php有已演示的利用路径,PHP-FPM也不能直接认为不受影响。
| PHP分支 | 该分支中受影响的版本 | 10月21日修复版 | 官方安全支持截止 |
|---|---|---|---|
| 8.2 | 低于8.2.35 | 8.2.35 | 2026年12月31日 |
| 8.3 | 低于8.3.36 | 8.3.36 | 2027年12月31日 |
| 8.4 | 低于8.4.27 | 8.4.27 | 2028年12月31日 |
| 8.5 | 低于8.5.12 | 8.5.12 | 2029年12月31日 |
PHP 8.1已在2025年12月31日结束官方支持。多PHP解决的是网站之间的兼容安排,修复漏洞仍然要更新实际提供Web服务的PHP。仅把新版本装在服务器上,旧站仍指向未修复的版本,风险不会自动消失。
官方公告:https://www.php.net/archive/2026.php ;支持周期:https://www.php.net/supported-versions.php 。
二、多PHP共存
CustomBuild是DirectAdmin管理PHP、Web服务器等组件的工具,通常从源码构建软件。当前官方多PHP文档支持php1至php9槽位。php1_release是默认分支,未单独选择的域名及面板Web应用要考虑它;php2_release以后是额外分支,no表示不启用。
| 示例槽位 | 分支示例 | 用途与限制 |
|---|---|---|
| php1_release | 8.1 | 旧环境默认槽位示例;已EOL,不建议新部署 |
| php2_release | 8.2 | 旧站过渡;需安装安全修复并安排迁移 |
| php3_release | 8.3 | 新增可选分支,需维护到当前补丁版 |
| php4_release | 8.4 | 新增可选分支,先测试程序兼容性 |
如果自己的php1是8.2、php2是8.1,就保持原顺序。域名配置选择的是槽位,重排槽位可能让已有网站换到另一分支。PHP-FPM通过独立工作进程处理Web请求,多版本可以并行提供服务,各域名分别选择其中一版。
三、安装多PHP
以下命令在装有DirectAdmin的服务器上,由有系统管理权限的管理员执行。面板Admin身份不自动等于SSH root权限;只买了虚拟主机的普通用户,通常只能选择服务商已安装的版本。
command -v da grep -E '^(webserver|php[1-9]_(release|mode))=' /usr/local/directadmin/custombuild/options.conf da build versions da config-get php_version_selector
第一行确认命令入口;第二行只列Web服务器、PHP分支和模式;da build versions对比已装版本与CustomBuild提供的版本;最后一行看选择器是否开启。槽位写了8.4只是构建目标,还要核对安装结果。支持哪些选项可用da build opt_help查看。
已有网站先做文件及数据库备份,记录各域名的PHP选择,另留options.conf、定制构建参数、相关php.ini和Web配置。可以先保存构建选项:
cd /usr/local/directadmin/custombuild cp -a options.conf "options.conf.before-multi-php.$(date +%Y%m%d-%H%M%S)"
增加版本前,核对操作系统与依赖是否受当前CustomBuild支持,预留编译所需内存、磁盘和维护时间。不同分支还要有网站需要的扩展。已有自定义模板的主机,重写配置可能影响手工修改,不能把备份options.conf当成备份了全部运行环境。
四、面板自动安装
新版Evolution的入口是管理员级别 → Server Manager → CustomBuild。1.678之前的菜单常在Extra Features,中文翻译也可能不同,找不到时可搜索CustomBuild。它现在已集成到面板,不必为了教程另装一个第三方GUI。
- 登录自己的DA后台,切到Admin Level,确认操作的是要管理的那台服务器。
- 打开CustomBuild,进入Options。找到PHP配置区域;界面小标题可能译为PHP Settings,也可按php1_release等键名定位。
- 记下php1_release、php2_release原值及当前模式,不改变原有顺序。
- 找到尚未使用的php3_release、php4_release,将它们分别选为8.3、8.4。已被使用的槽位不能覆盖。若界面不提供该分支,先核对当前CustomBuild支持情况。
- 检查php1_mode。本文接下来按PHP-FPM写;已经是php-fpm就保持,不要顺手更换Web服务器或处理模式。
- 保存Options,确认重新打开后选项仍在。保存选项本身并没有完成PHP安装。
- 在当前GUI提供的构建/软件任务入口执行PHP构建,等待结果;只有Updates时,它主要列已有软件的更新,不能把选好版本理解为已经装好。没有独立构建入口可直接用下一节SSH命令。
- 构建成功后应用Web配置重写,再核对版本、服务及用户侧选择器。GUI未提供相应动作时,用下一节的da build rewrite_confs。不要连续启动多个相同构建任务。
新版CustomBuild统一使用php1_mode。从1.669起,options.conf不再保留php2_mode至php9_mode,所以旧教程逐个设置php3_mode、php4_mode的命令不应继续照抄。旧版界面可能仍显示这些项,要按实际版本和官方变更记录处理。

五、PHP 8.3和8.4
5.1 添加新版本
假定:php1、php2分别保留原来的8.1、8.2,php3、php4尚未启用,且当前Web环境已经使用PHP-FPM。如果php3、php4已经装好,跳过本段,直接去选择器和验证部分。
da build set php3_release 8.3 da build set php4_release 8.4
分支号用8.3、8.4,不是把8.4.27填进release选项。具体补丁版由CustomBuild版本清单决定。现有php1和php2不用再set一次,也不用卸载。
只有在已确认适用、并计划采用PHP-FPM的环境中,模式设置才是下面这一行;若已经是php-fpm,无需重复执行。切换现有模式会影响所有配置的PHP分支,不能当作新增槽位的无害附带操作。
da build set php1_mode php-fpm
5.2 编译配置
da build php da build rewrite_confs da build versions
按顺序执行,前一步报错就先查错,不继续重写配置。da build php会构建所有已配置的PHP分支,可能更新已有分支的补丁版并重启相关服务;不能只按“新增两个版本”估计影响。rewrite_confs会重建Web配置,可能重载相关服务。安排维护窗口,保留完整构建错误,不要靠末尾几行输出判断成功。
较新的CustomBuild还支持指定已配置分支,例如da build php 8.3和da build php 8.4,可分别构建后再统一重写配置;官方从1.659记录了这个用法。先用本机help核对,不再使用旧的php_expert命令。
/usr/local/php83/bin/php -v /usr/local/php84/bin/php -v
这里核对对应分支的CLI二进制,常见目录分别是/usr/local/php83和/usr/local/php84。路径以实际安装输出为准;文件不存在,就回查构建结果,不手工建软链接来掩盖失败。还要确认FPM服务正常、域名真正选择了它,CLI能运行只完成了一部分验收。
六、开启多PHP
安装多个PHP,与让用户看到版本下拉框,是两件事。管理员先检查:
da config-get php_version_selector
当前官方文档的默认值是1。已经返回1就不用再设置;若为0,由管理员启用:
da config-set php_version_selector 1 da config-get php_version_selector
da config-set会写入DA配置,并默认触发面板服务重新加载或重启,不需要再照旧教程额外追加一次重启。随后重新打开用户级域名设置检查。值为1但仍看不到时,先确认确实装好了至少两种可选PHP、域名启用了PHP、账号和主题允许显示选择器。
七、不同网站PHP版本
切回站点所属账号的User Level → Account Manager → Domain Setup,打开具体域名,找到PHP版本选择项。选目标分支并保存,等配置应用后,重新打开确认,再做下一节的Web验证。不同皮肤可能把该项放在域名设置的其他位置。
| 域名示例 | 选择的槽位 | 实际运行分支示例 |
|---|---|---|
| legacy.example.com | php1 | 8.1,仅说明旧站过渡,不建议继续承载公网业务 |
| forum.example.net | php2 | 8.2,须补安全更新并安排迁移 |
| blog.example.org | php3 | 8.3的当前修复版 |
| app.example.com | php4 | 8.4的当前修复版 |
这里的四个域名是分别添加到账号中的站点示例,实际可选项以服务器槽位为准。保存前记下原选择,先用测试副本检查程序、主题、插件、加密扩展及登录、上传等功能。新建域名没有单独选择时要核对默认php1;添加后再按需切换。
八、子域名切换PHP
主域名下面通过子域名功能建立的站点,进入User Level → Sub-Domains Setup。找到目标子域名,打开Document Root Override;有的皮肤是文档根目录旁的编辑图标,在其中的PHP Version Selector选择分支并保存。
底层的php1_select=2表示选第二槽位,不代表PHP 2,也不保证第二槽位是8.2。日常优先在GUI保存,让DA维护配置;不需要手工编辑子域名覆盖文件或复制整套目录。子域名切换后要用它自己的URL验证。
九、确认新PHP?
建议把“构建选项、已装二进制、运行中的FPM、实际域名”分开核对。终端php -v受PATH和默认链接影响,/usr/local/php84/bin/php -v能确认8.4二进制,但两者都不能证明某个域名正在使用8.4。
在目标网站的实际文档根目录临时创建一个不易猜测的PHP文件,仅输出必要信息,例如:
<?php
header('Content-Type: text/plain; charset=utf-8');
echo 'PHP: ', PHP_VERSION, "\n";
echo 'SAPI: ', PHP_SAPI, "\n";
用该域名的HTTPS地址访问,确认版本及SAPI。PHP-FPM通常显示fpm-fcgi;若显示其他模式,不要把它当作FPM验收。使用临时独立文件避免旧页面缓存干扰,验证后立即删除并确认不能再访问。需要核查Loaded Configuration File或扩展时,可临时用phpinfo(),但应限制访问、及时删除,不长期公开环境详情。
管理员还可只读查看相关FPM服务。先列出本机单元,再查看实际存在的名称;以下status以php-fpm84为例:
systemctl list-units --type=service --all 'php-fpm*' systemctl status php-fpm84 --no-pager
单元名称和隔离模式可能不同,以本机为准。验收还包括后台登录、保存文章、上传、评论和计划任务;有电商业务时测试购物车和结算流程,避免发起真实交易。不能只看到首页能打开就结束。
十、常见问题
| 现象 | 常见原因及处理 |
|---|---|
| 8.3、8.4装了却无法选择 | 先核对options.conf、对应二进制和FPM,再看选择器开关、域名PHP权限与配置重写是否成功。只保存Options不算安装。 |
| 找不到CustomBuild | 确认处于管理员级别;新版在Server Manager,旧版可能在Extra Features。仅有普通用户权限无法构建,没有GUI可由管理员用SSH。 |
| 找不到PHP Version Selector | 核对php_version_selector、是否有多个可用分支、域名是否开启PHP及皮肤支持;子域名要到Document Root Override查。 |
| PHP编译失败 | 保留第一处有效configure/make错误,排查不支持的系统、缺少依赖、下载校验或资源不足。不要反复启动同一构建,也不要随意安装第三方包替代。 |
| FPM无法启动 | 查看实际服务status和journal,检查配置语法、端口或socket冲突及扩展加载错误。不要通过重启全部服务掩盖问题。 |
| 切换后500或白屏 | 先退回原版本恢复,再根据网站错误日志查旧代码、主题、插件、加密加载器。白屏也可能是错误不显示,不应直接打开全站display_errors。 |
| WordPress插件不兼容 | 在测试副本更新官方版本并验证;商业插件需合法兼容包。保留原站工作版本,不能把临时修补当成长久支持。 |
| 缺少mysqli、mbstring、curl、zip或intl | 检查目标分支的-m与Web侧信息。确认CustomBuild构建参数/依赖及对应扩展配置,不能只查系统默认php -m。 |
| 扩展安装后仍不生效 | 确认扩展为目标PHP分支构建、ABI匹配,使用该分支的phpize/php-config并在正确的ini目录启用。不要把另一版本的.so直接复制过来。 |
| CLI与网站版本不同 | 这是两条执行路径。分别使用正确的CLI绝对路径及域名选择器;定时任务也要核对解释器路径。 |
| 改php.ini没有变化 | 核对Web侧加载的ini、附加ini、FPM池及.user.ini覆盖。更改全局ini后按实际部署让目标FPM重新加载,CLI –ini只说明CLI。 |
| 新版本已更新,网站还显示旧版 | 检查域名/子域名槽位、Web服务是否应用配置、是否连到另一源站,以及仍在运行的旧FPM工作进程。浏览器缓存不能作为唯一解释。 |
| php1至php4顺序与本文不同 | 保持原有槽位,按实机映射选择。不要为对齐示例重排php1/php2,更不要替换已被域名使用的槽位。 |
| 怎样退回原PHP | 在同一域名或子域名选择器切回记录下来的原槽位,再核验Web版本和功能。若同时改过业务数据或做了破坏性程序升级,仅退PHP不能回滚数据。 |
查8.4扩展和CLI配置时可以用下面的只读命令;若要排查另一个分支,换成它的实际安装路径:
/usr/local/php84/bin/php -m /usr/local/php84/bin/php --ini da build used_configs
CustomBuild有现成的扩展构建方式,也支持custom目录下的定制构建参数。先对照当前帮助和官方扩展文档,不在这里把所有扩展写成同一条安装命令。FPM不会原生读取.htaccess里的php_value/php_flag;.user.ini也只有部分选项可覆盖,默认有300秒缓存,管理级配置不一定允许用户覆盖。
十一、更新与迁移
8.3.35更新到8.3.36属于同分支补丁更新;8.2切到8.4是分支迁移,兼容测试的范围不同。多PHP服务器要把仍提供Web服务的各分支都维护好,不能只更新默认PHP。以下是只更新已配置8.4分支的流程示例:
da build update da build versions da build php 8.4 da build versions
先刷新CustomBuild构建资料并查看可用补丁,核对custom_versions.txt是否固定了旧版本,再构建目标分支。当前版本支持单分支构建时,不必为了一个补丁执行update_versions或build all。若构建任务未自动完成所需配置应用/服务重新加载,按实际输出处理,再检查Web侧和旧工作进程。仅看到CLI新版本不算补丁部署完成。
新站优先选择仍维护且程序支持的分支;旧WordPress、论坛先复制到测试站,补齐扩展、更新主题和插件,验证通过后逐域名迁移。8.1只能是有明确退出时间的临时兼容安排;8.2的安全支持也只到2026年底,需要提前准备,不能因为下拉框还能选就一直留着。
DirectAdmin多PHP最实用的地方,就是不用让一台服务器上的网站同时换环境。实际操作记住三件事:不乱动已有槽位,配置后确实完成构建,切换后从网站端验证。漏洞修复和程序兼容要分别核对,出了问题先按原选择恢复访问,再继续排查。
文章出自:挖站否 https://wzfou.com/directadmin-multi-php/,版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。












