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-pear

PECL 装扩展

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-fpm

2、CentOS / Rocky / Alma:

启用 EPEL 源

yum install -y epel-release

安装依赖

yum install -y gcc make autoconf php-devel brotli-devel libzstd-devel php-pear

PECL 装扩展

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 --ini
  • which 输出的 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.tgz

4、编译安装 brotli(直接用第 2 步定义的变量):

cd /tmp
tar xzf brotli.tgz
cd brotli-*
"$PHPIZE"
./configure --with-php-config="$PHP_CONFIG"
make -j2
make install

5、写入 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 install

7、写入 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-dev

2、多版本共存: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 loadedphp.ini 里有重复的 extension 行删掉重复行,只保留一行

参考链接

文章目录