El algoritmo de compresión Brotli creado por Google ya tiene algunos años en uso, aunque con una adopción lenta por parte de los servidores siendo que sí ofrece una gran mejora en cuanto al uso de Gzip y Deflate. A continuación, les mostrare como compilar la extensión para PHP de Brotli, que no hay que confundir con el módulo de Nginx. Esta extensión nos permite aprovechar las características, como su alta tasa de compresión con menos uso de CPU, y nos puede ayudar en el caso de la precompresión que usa Nginx con "brotli_static" ya que Nginx solo se encarga de servir el contenido y no de comprimirlo, al contrario de la compresión normal de las peticiones HTTP.
Para las pruebas se usó Debian Buster y Ubuntu Focal, con PHP 7.3 y PHP 7.4 respectivamente. Estas instrucciones son compatibles con PHP 7.*.
Compilación de extensión PHP
Antes de compilar la extensión instalamos el siguiente paquete:
sudo apt install php-dev
Para empezar a compilar ejecutar:
git clone --recursive --depth=1 https://github.com/kjdev/php-ext-brotli.git
cd php-ext-brotli
phpize
./configure
make
Instalación en el mismo sistema
Aquí sólo ejecutamos:
sudo make install
Esto copiará automáticamente la extensión del directorio php-ext-brotli/modules/brotli.so hacia el directorio donde se encuentran las demás extensiones de PHP. Nos dirigimos al directorio:
cd /etc/php/7.*/mods-available/
Creamos un archivo llamado brotli.ini:
sudo nano brotli.ini
Lo guardamos con el contenido:
extension=brotli.so
Instalación en otro sistema
Este procedimiento se usa si vamos a instalar la extensión en otro sistema con las mismas versiones de sistema operativo y PHP, para comprobar la versión de PHP, usamos el comando php -v
. En el sistema que se instalará, para saber el directorio de extensiones de PHP ejecutamos:
php -i | grep '^extension_dir' | sed -e 's/extension_dir => .* => //'
Tomando en cuenta que trabajamos en el directorio home de nuestro usuario y la carpeta donde se encuentra el código fuente de la extensión es php-ext-brotli. Copiamos el archivo resultante del sistema en el que compilamos la extensión, a la carpeta generada por el comando anterior en el sistema destino.
Sistema origen:
php-ext-brotli/modules/brotli.so
Sistema destino:
DIRECTORIO_GENERADO_COMANDO_ANTERIOR/brotli.so
Ejemplo de directorio completo del sistema destino (no usar esta ruta en específico):
/usr/lib/php/20180731/brotli.so
Por último, creamos el archivo brotli.ini:
sudo nano /etc/php/7.*/mods-available/brotli.ini
Con el siguiente texto:
extension=brotli.so
Guardamos y pasamos al siguiente paso.
Activación y comprobación de la extensión
Para activar la extensión ejecutamos el comando:
sudo phpenmod brotli
Si no existen problemas el comando no debe mostrar errores. Para comprobar si se ha cargado la extensión ejecutamos:
php -m
En la sección "[PHP Modules]" debe aparecer "brotli". Para comprobar el funcionamiento de la extensión desde PHP CLI ejecutamos el siguiente comando:
php -r "echo brotli_uncompress(base64_decode('CwGAUEhQAw==')) . \"\n\";"
El resultado de ese comando debe ser:
PHP
Si obtenemos el error:
PHP Fatal error: Uncaught Error: Call to undefined function brotli_uncompress() in Command line code:1
Significa que la extensión no está activada o no es compatible.
Al terminar es necesario reiniciar PHP.
Nginx, PHP y PHP-FPM, cambiando 7.3 por la versión que estamos usando.:
sudo systemctl restart php7.3-fpm
Apache y PHP:
sudo systemctl restart apache2
PHP CLI:
No es necesario reiniciar.
Enlace al repositorio de la extensión PHP de Brotli.