夜雨聆风学习资料网

ARTICLE · 1290761

古法运维:源码编译 PHP8.3.36 且融入宝塔

古法运维:源码编译 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 服务器上,宝塔里安装一直都是失败的,关键报错信息如下:

...log

/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

...bash

# 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.源码修改说明

源码编译的时候,会出现错误:

...log

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 目录,补齐宝塔面板需要的文件,以便在宝塔管理后台能进行管理:

...bash

# 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

...ini

[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 环境下,需要使用这些禁用函数,当然,也可以根据需要自己酌情处理。

最后:

...bash

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。

END

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

点赞
在看
转发

THANKS FOR READING

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料