PHP 安装 Brotli 与 Zstd 扩展指南(Linux 版)
Brotli 与 Zstd 是两种压缩算法,PHP 本身不内置,需要装扩展提供 brotli_compress() 与 zstd_compress() 函数。
使用环境:Linux,任意方式安装的 PHP(源码编译 / 发行版包 / 宝塔面板)。
一、判断扩展是否已装
php -m | grep -iE 'brotli|zstd'有输出 = 已装好,结束。无输出 = 继续。
二、判断 PHP 安装方式
用宝塔面板的,直接走第三节。其他的先看路径:
which php/usr/bin/php→ 发行版包安装,走第四节。/usr/local/php/bin/php→ 源码编译安装,走第五节。
三、宝塔面板安装
0、先确认版本目录(别猜,用命令看):
ls /www/server/php/看到的是已安装的 PHP 版本目录名(如 74=PHP 7.4、82=PHP 8.2),下面命令里的 82 全部换成实际看到的目录名。面板上「软件商店 → PHP」也能看到已装版本;站点设置里可看该站用的版本。
1、面板装:
宝塔 → 软件商店 → 你的 PHP 版本 → 设置 → 安装扩展,列表里有 brotli / zstd 直接勾选安装。
面板列表因宝塔版本而异(如 7.7 有 zstd 无 brotli),没有的用命令行。
2、命令行装 brotli(82 换成第 0 步看到的目录名):
下载源码
cd /tmp
curl -L -o brotli.tgz https://pecl.php.net/get/brotli
ls -lh brotli.tgz解压进入
tar xzf brotli.tgz
cd brotli-*编译安装
/www/server/php/82/bin/phpize
./configure --with-php-config=/www/server/php/82/bin/php-config
make -j2
make install写入配置
grep -q "^extension=brotli" /www/server/php/82/etc/php.ini || echo "extension=brotli" >> /www/server/php/82/etc/php.ini只需 brotli 时,装完重载:/etc/init.d/php-fpm-82 reload(失败改用面板重启该 PHP)。
3、命令行装 zstd:
下载源码
cd /tmp
curl -L -o zstd.tgz https://pecl.php.net/get/zstd
ls -lh zstd.tgz解压进入
tar xzf zstd.tgz
cd zstd-*编译安装
/www/server/php/82/bin/phpize
./configure --with-php-config=/www/server/php/82/bin/php-config
make -j2
make install写入配置并重载
grep -q "^extension=zstd" /www/server/php/82/etc/php.ini || echo "extension=zstd" >> /www/server/php/82/etc/php.ini
/etc/init.d/php-fpm-82 reload重载失败改用面板重启该 PHP,扩展此时已装好,只差重载。
四、apt / yum 安装
1、Debian / Ubuntu(8.2 以 php -v 第一行显示的版本号为准):
安装依赖
apt install -y gcc make autoconf php8.2-dev libbrotli-dev libzstd-dev php-pearPECL 装扩展
pecl install brotli
pecl install zstd写入配置并启用
echo "extension=brotli" > /etc/php/8.2/mods-available/brotli.ini
echo "extension=zstd" > /etc/php/8.2/mods-available/zstd.ini
phpenmod brotli zstd
systemctl reload php8.2-fpm2、CentOS / Rocky / Alma:
启用 EPEL 源
yum install -y epel-release安装依赖
yum install -y gcc make autoconf php-devel brotli-devel libzstd-devel php-pearPECL 装扩展
pecl install brotli
pecl install zstd写入配置并启用
echo "extension=brotli" > /etc/php.d/30-brotli.ini
echo "extension=zstd" > /etc/php.d/31-zstd.ini
systemctl reload php-fpm五、源码编译安装
1、查看路径(先确认拿到的是目标版本):
which php phpize php-config
php --iniwhich输出的 phpize / php-config 路径,就是后面要用的真实路径(在 PATH 中时直接可用);php --ini的Loaded Configuration File行,就是 php.ini 的真实位置;- 源码编译的安装目录由编译时的
--prefix决定(如/usr/local/php、/opt/php、/usr/local/php-8.2),没有标准路径;若which查不到 phpize(未加入 PATH),从 php 二进制推导:which php为/xxx/php/bin/php时,安装目录就是/xxx/php,phpize / php-config 在其bin/下,php.ini 通常在etc/下。 - 多版本环境:
which php拿到的是默认版本,网站实际用的以 phpinfo() 为准;先把目标版本 bin 目录export PATH=...:$PATH前置再执行本步(见「其他 2」)。
查不到 phpize 说明不是源码编译安装,回第四节。
2、定义变量(整段执行,路径自动提取,无需手工填写):
PHPIZE=$(command -v phpize)
PHP_CONFIG=$(command -v php-config)
PHP_PREFIX=$(dirname "$(dirname "$(command -v php)")")
PHP_INI=$(php --ini | sed -n 's/^Loaded Configuration File:[[:space:]]*//p')
[ "$PHP_INI" = "(none)" ] && PHP_INI="$PHP_PREFIX/etc/php.ini"
PHP_SCAN_DIR=$(php --ini | sed -n 's/^Additional .ini files parsed:[[:space:]]*//p' | sed 's/,.*//' | xargs -r dirname 2>/dev/null)变量仅对当前终端会话有效:关闭或重开终端后,先重新执行本步,再继续后续步骤。
3、下载两个源码包:
cd /tmp
curl -L -o brotli.tgz https://pecl.php.net/get/brotli
ls -lh brotli.tgz
curl -L -o zstd.tgz https://pecl.php.net/get/zstd
ls -lh zstd.tgz4、编译安装 brotli(直接用第 2 步定义的变量):
cd /tmp
tar xzf brotli.tgz
cd brotli-*
"$PHPIZE"
./configure --with-php-config="$PHP_CONFIG"
make -j2
make install5、写入 brotli 配置(有扫描目录写独立 ini,没有追加主 php.ini,路径用第 2 步变量):
{ [ -n "$PHP_SCAN_DIR" ] && echo "extension=brotli" >> "$PHP_SCAN_DIR/brotli.ini" || echo "extension=brotli" >> "$PHP_INI"; }6、编译安装 zstd(直接用变量):
cd /tmp
tar xzf zstd.tgz
cd zstd-*
"$PHPIZE"
./configure --with-php-config="$PHP_CONFIG"
make -j2
make install7、写入 zstd 配置(同上):
{ [ -n "$PHP_SCAN_DIR" ] && echo "extension=zstd" >> "$PHP_SCAN_DIR/zstd.ini" || echo "extension=zstd" >> "$PHP_INI"; }8、重载:
systemctl reload php-fpm编译安装版常用 kill -USR2 $(cat <php-fpm.pid>)。
六、验证
php -m | grep -iE 'brotli|zstd'
php -r "var_dump(function_exists('brotli_compress'), function_exists('zstd_compress'));"期望输出 bool(true) bool(true)。
网页环境用 phpinfo()(站点探针) 确认;CLI 与 fpm 是两个 php.ini,fpm 需单独确认。
其他
1、缺开发库按发行版补:
# Debian / Ubuntu
apt install -y gcc make autoconf php-dev libbrotli-dev libzstd-dev
# CentOS / Rocky / Alma
yum install -y epel-release gcc make autoconf php-devel brotli-devel libzstd-devel
# Alpine
apk add build-base autoconf phpize brotli-dev zstd-dev2、多版本共存:which php 显示的是默认版本,网站实际用的以 phpinfo() 为准。确定目标版本后,先把它的 bin 目录放到 PATH 最前面,第 1 步命令块里的 command -v php / php --ini 就会自动命中目标版本:
export PATH=/usr/local/php82/bin:$PATH # 换成目标版本目录(宝塔为 /www/server/php/82/bin)然后执行第五节第 2 步定义变量即可(第 1 步查看可选)。不想动 PATH 的,也可以把第 2 步命令块里的 command -v php / php --ini 全部换成目标版本绝对路径(如 /usr/local/php82/bin/php --ini)。
3、编译前核对:php -v 与 php-config --version 主版本一致;phpize --version 的 PHP Api Version 是 API 编号不是版本号。
4、配置写哪里:php --ini 有 Additional .ini files parsed 行(存在扫描目录)写独立 ini,没有追加主 php.ini。第五节第 2 步已自动提取为 PHP_SCAN_DIR / PHP_INI,命令块直接使用。
5、容易疑惑名词:
- Brotli / Zstd:压缩算法(Google / Facebook 开发)。
- brotli / zstd 扩展:PECL 上的 PHP 扩展,提供
brotli_compress()/zstd_compress()。 - pecl:PHP 扩展安装器(官方已弃用,推荐 PIE,见参考链接)。
- phpize:源码编译 PHP 扩展的工具。
附
- pecl install 过程提示(如询问安装路径 /usr)直接回车用默认值。
- 老 PHP(7.x)pecl 装最新版可能不兼容,指定版本:
pecl install brotli-0.17.0、pecl install zstd-0.13.3。 - 常见问题:
| 症状 | 原因 | 解决 |
|---|---|---|
phpize: command not found | 没装 -dev 包 | apt install php8.2-dev / yum install php-devel |
| configure 报缺 libbrotli / zstd library | 缺开发库 | 装 libbrotli-dev / brotli-devel、libzstd-dev / libzstd-devel |
| 扩展编译后无法加载 / php -v 崩溃 | 版本或 API 编号不一致 | 按其他第 3 条核对后重编 |
| 后台仍提示未启用 | fpm 与 CLI 的 php.ini 不同 | 确认写入的是 fpm 的 php.ini |
| 面板重启后扩展消失 | 面板重装/升级 PHP | 按面板方式重装 |
提示 Module 'brotli' already loaded | php.ini 里有重复的 extension 行 | 删掉重复行,只保留一行 |
参考链接
- PECL brotli:https://pecl.php.net/package/brotli
- PECL zstd:https://pecl.php.net/package/zstd
- PHP 官方手册(PECL 已弃用、推荐 PIE):https://www.php.net/manual/zh/install.pecl.intro.php
- phpize 官方文档:https://www.php.net/install.pecl.phpize
- PIE(PHP 扩展安装器):https://github.com/php/pie
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。