ARTICLE · 1290761
古法运维:源码编译 PHP8.3.36 且融入宝塔
欢迎大家关注「编程随手记」公众号。
2026-10-21 日,网上公开了 PHP 的两个大漏洞,编号为 CVE-2026-109618、CVE-2026-109619。漏洞原理,「风雪之隅」大佬已经讲的很浅显易懂了,可以去他的博客拜读,其对应的公众号文章由于不知名的原因而违规,被下了。
https://www.laruence.com/2026/10/22/7686.html
背景
目前安装的版本是 PHP8.3.27,需升级到官方的 PHP8.3.36 避免漏的影响。
但在 Amazon Linux 2 服务器上,宝塔里安装一直都是失败的,关键报错信息如下:
/www/server/php/83/src/ext/openssl/xp_ssl.c:506:6: warning: implicit declaration of function ‘ASN1_STRING_get0_data’; did you mean ‘ASN1_STRING_data’? [-Wimplicit-function-declaration]
ASN1_STRING_get0_data(san->d.iPAddress)[0],
^~~~~~~~~~~~~~~~~~~~~
ASN1_STRING_data
/www/server/php/83/src/ext/openssl/xp_ssl.c:506:45: error: subscripted value is neither array nor pointer nor vector
ASN1_STRING_get0_data(san->d.iPAddress)[0],
^
/www/server/php/83/src/ext/openssl/xp_ssl.c:507:45: error: subscripted value is neither array nor pointer nor vector
ASN1_STRING_get0_data(san->d.iPAddress)[1],
^
/www/server/php/83/src/ext/openssl/xp_ssl.c:508:45: error: subscripted value is neither array nor pointer nor vector
ASN1_STRING_get0_data(san->d.iPAddress)[2],
^
应该是 openssl 版本的兼容问题。升级 Amazon Linux 2 里的 openssl,没有效果,只能考虑源码编译了,并且希望源码编译后能继续使用宝塔进行管理。
源码编译
建议先备份配置/www/server/php/83/etc
# by 编程随手记
# 备份配置
mkdir -p ~/php83/etc
cp -a /www/server/php/83/etc ~/php83/etc
# 依赖更新
sudo yum install -y gcc gcc-c++ make autoconf bison re2c \
libxml2-devel sqlite-devel libcurl-devel libpng-devel libjpeg-turbo-devel \
freetype-devel libicu-devel oniguruma-devel libzip-devel libsodium-devel \
libwebp-devel libvpx-devel lksctp-tools-devel brotli-devel libssh2-devel
# 手动安装 openssl 1.1.12
mkdir -p ~/openssl
cd ~/openssl
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar zxvf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
./config --prefix=/usr/local/openssl111 --openssldir=/usr/local/openssl111 shared zlib
make && make install
# 更新动态链接库缓存
echo "/usr/local/openssl111/lib" > /etc/ld.so.conf.d/openssl111.conf
ldconfig
# 下载源码并解压
cd /usr/local/src
sudo wget https://www.php.net/distributions/php-8.3.36.tar.gz
sudo tar zxf php-8.3.36.tar.gz
# 指定 OpenSSL 1.1.1w
export PKG_CONFIG_PATH=/usr/local/openssl111w/lib/pkgconfig
export LD_LIBRARY_PATH=/usr/local/openssl111w/lib
export CPPFLAGS="-I/usr/local/openssl111w/include"
export LDFLAGS="-L/usr/local/openssl111w/lib"
# 备份 PHP 源码
cd /usr/local/src/php-8.3.36
cp ext/openssl/xp_ssl.c /tmp/xp_ssl.c.bak
# 修改 PHP openssl 相关的源码
sed -i 's/ASN1_STRING_get0_data/ASN1_STRING_data/g' \
ext/openssl/xp_ssl.c
sudo ./configure \
--prefix=/www/server/php/83 \
--with-config-file-path=/www/server/php/83/etc \
--with-config-file-scan-dir=/www/server/php/83/etc/php.d \
--enable-fpm --with-fpm-user=www --with-fpm-group=www \
--with-openssl=/usr/local/openssl111w \
--with-curl --with-zlib --with-libxml --enable-mbstring \
--with-mysqli --with-pdo-mysql --with-pdo-sqlite --with-sqlite3 \
--with-gd --with-jpeg --with-freetype --with-webp \
--enable-intl --enable-zip --with-zip --with-sodium \
--enable-opcache --enable-bcmath --enable-sockets \
--with-libdir=lib64
sudo make -j$(nproc)
sudo make install
A.源码修改说明
源码编译的时候,会出现错误:
error: subscripted value is neither array nor pointer nor vector
EXPAND_IPV6_ADDRESS(ipbuffer, ASN1_STRING_get0_data(san->d.iPAddress));
参考:https://fossies.org/windows/www/php-8.3.35-src.zip/ext/openssl/xp_ssl.c
将 xp_ssl.c 中的 ASN1_STRING_get0_data() 替换为旧接口 ASN1_STRING_data()。后者在 OpenSSL 1.1.1 中仍可用,只是已被弃用。
§ 分段
SECTION 02
装完后融入宝塔管理面板
编译后的 php 已经放在 /www/server/php/83 目录,补齐宝塔面板需要的文件,以便在宝塔管理后台能进行管理:
# 1. 版本元数据(面板靠它显示版本号)
echo "8.3.36" | sudo tee /www/server/php/83/version.pl
# 2. php.ini:从源码目录拷一份模板
sudo cp /usr/local/src/php-8.3.36/php.ini-production /www/server/php/83/etc/php.ini
# 3. php-fpm 服务脚本:从 aaPanel (宝塔国际版域名)镜像拉(这个不是 PHP 本体,是 init 脚本)
sudo wget -O /etc/init.d/php-fpm-83 ${NODE_URL:-https://cf1-node.aapanel.com}/init/php/php-fpm-83
sudo sed -i 's/# Provides: php-fpm/# Provides: php-fpm-83/g' /etc/init.d/php-fpm-83
sudo chmod +x /etc/init.d/php-fpm-83
sudo chkconfig --add php-fpm-83
sudo chkconfig --level 2345 php-fpm-83 on
php-fpm.conf
[global]
pid = /www/server/php/83/var/run/php-fpm.pid
error_log = /www/server/php/83/var/log/php-fpm.log
log_level = notice
[www]
listen = /tmp/php-cgi-83.sock
listen.backlog = 8192
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0600
user = www
group = www
pm = dynamic
pm.status_path = /phpfpm_83_status
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 20
request_terminate_timeout = 100
如果有备份,直接将 /www/server/php/83/etc 目录里的文件覆盖就行
注释 cli 里的禁用函数:
sudo vim /www/server/php/83/etc/php-cli.ini
搜索 disable_functions,将该行进行注释。
一般 cli 环境下,需要使用这些禁用函数,当然,也可以根据需要自己酌情处理。
最后:
sudo mkdir -p /www/server/php/83/var/run /www/server/php/83/var/log
sudo /etc/init.d/php-fpm-83 start
/www/server/php/83/bin/php -v # 应显示 8.3.36
ls -l /tmp/php-cgi-83.sock
sudo bt restart # 刷新面板缓存
RESULT进 宝塔面板 → 软件商店 → PHP 管理,看 8.3 是否出现、版本是否 8.3.36。

既然看到这里了,如果觉得有用,随手点个赞、在看、转发三连吧。
THANKS FOR READING















































































