Configurar extensiones PHP, para WordPress

WordPress necesita 3 elementos para funcionar: un servidor web, una base de datos y el motor que hace que todo funcione, PHP. Y en general damos por hecho que PHP viene bien montado en nuestro alojamiento, y no suele ser así.

En la documentación oficial de WordPress sobre hosting se hablan de los requerimientos de PHP. En general estoy de acuerdo pero creo que son bastante restrictivos y que sólo miran en lo que es WordPress en sí mismo, pero no en las ventajas que puede tener incluir unas extensiones extra de PHP al funcionamiento habitual.

También es verdad que algunas de las extensiones son complementarias entre sí, por ejemplo la de GD e ImageMagick. Si tienes una de las dos es suficiente, pero es posible que algún plugin utilice la otra por no estar desarrollado el sistema mejorado.

Es por esto que me he planteado hacer un poco de investigación sobre WordPress 5.2.3 y algunos de los plugin más conocidos y extendidos.

¿Qué he hecho?

Lo primero ha sido montar una máquina VPS en la que he montado PHP 7.4beta4. En realidad no hace falta y sé que esta versión aún no lo soporta, pero es compatible con lo actual.

Lo otro que he hecho ha sido meter en una carpeta la versión de WordPress, y configurar PHP CompatInfo, una herramienta que permite analizar el código PHP. Esto no me dirá exactamente qué funciones son alternativas, pero un mínimo conocimiento de WordPress ya te deja intuir por dónde van los tiros.

El primer análisis devuelve la siguiente información:

ComponentExtensionPHP
Core7.0.27.0.2
PDO5.1.05.1.0
Reflection5.0.05.0.0
SimpleXML5.0.15.0.1
Zend OPcache7.0.25.2.0
com_dotnet4.0.0
ctype4.0.44.0.4
curl5.0.05.0.0
date5.2.05.2.0
dom5.0.05.0.0
exif4.3.04.3.0
fileinfo1.0.5-dev5.3.0
filter0.11.05.0.0
ftp4.0.05.0.0
gd4.3.24.3.2
gettext4.0.04.0.0
hash5.6.0beta15.6.0beta1
iconv5.0.05.0.0
imagick3.4.05.4.0
imap4.0.04.0.0
intl2.0.0b15.4.0RC3
json5.5.05.5.0
libsodium4.0.0
libxml5.2.115.2.11
mbstring5.0.05.2.0
mcrypt4.0.04.0.0
memcache0.24.3.3
mysql5.2.35.2.3
mysqli5.0.05.0.0
mysqlnd4.0.0
opcache4.0.0
openssl5.4.07.1.0alpha2
pcre5.2.45.2.4
posix4.0.04.0.0
sockets4.3.04.3.0
sodium4.0.0
spl5.3.05.3.0
ssh20.54.0.0
standard7.0.27.0.2 (5.6.33)
suhosin4.0.0
tokenizer4.2.04.2.0
xdiff4.0.0
xml4.0.54.0.5
xmlreader5.0.05.0.0
zip1.6.05.2.0
zlib5.4.05.4.0

Esta fantástica tabla / lista de extensiones es la base sobre la que trabajar con WordPress. Y esta lista y las funciones que se usan vienen a decir que la versión óptima a utilizar es la de PHP 7.0.2, pero que se podría funcionar normalmente con PHP 5.6.33 (perdiendo algo de funcionalidad y sobre todo seguridad). Hay que recordar que desde 2019 cualquier versión de PHP menor a la rama 7.1 no está mantenida y puede ser insegura, por lo que, en este punto, lo ideal sería usar, al menos, PHP 7.1.

Instalando PHP

En este ejemplo voy a usar Ubuntu 18 como base, con el repositorio de ppa:ondrej/php. Y para empezar simplemente voy a instalar PHP y PHP-FPM (esto último no afecta a las extensiones, simplemente a cómo tengo configurado el nginx). Para ello lanzo lo siguiente:

add-apt-repository ppa:ondrej/php
apt -y update && apt -y upgrade && apt -y dist-upgrade && apt -y autoremove
apt -y install php7.4 php7.4-fpm

Una vez tenemos esto montado, vamos a ver qué extensiones lleva PHP por defecto instaladas y son compatibles con WordPress y cuáles tendrían que montarse de forma extendida. Para ello usamos el tradicional phpinfo().

Con el propio PHP vienen, pues, estas extensiones: Core, PDO, Reflection, Zend OPcache, ctype, date, exif, fileinfo, filter, ftp, gettext, hash, iconv, json, libsodium, libxml, opcache, openssl, pcre, posix, sockets, sodium, spl, standard, tokenizer y zlib.

Ahora queda qué hacer con las que tenemos pendientes…

Extensiones fáciles

Hay algunas extensiones que son bastante fáciles de conseguir. Si ejecutamos este comando también tendremos las siguientes de la lista…

apt -y install php7.4-curl php7.4-gd php7.4-mbstring php7.4-xml php7.4-zip

Esto nos ayuda con SimpleXML, curl, dom, gd, imap, intl, mbstring, xml, xmlreader y zip.

La base de datos

Otras extensiones importantes son las de la conexión a la base de datos, en este caso compatibles con los sistemas de conexión de MySQL (ya sean MySQL, MariaDB o similares). Existen y han existido varias versiones para las conexiones, y aunque se hable de tres de ellas, en realidad se necesitan simplemente dos.

apt -y install php7.4-mysql php7.4-mysqlnd

Con esto damos soporte a mysqli y mysqlnd, suficiente para que el sistema funcione.

Las que quedan

La lista de las que quedan es com_dotnet, imagick, mcrypt, memcache, ssh2, suhosin y xdiff.

La de com_dotnet es básicamente si montas tu sitio sobre Windows, por lo que en un principio no haría falta instalarla.

Las extensiones mcrypt tampoco son necesarias en versiones modernas (PHP +7.2) ya que estas funciones vienen a ser sustituidas por las sodium (ya instaladas).

La extensión ssh2 tampoco es necesaria a menos que para actualizar el sistema requieras conexiones no habituales. Por norma general no son necesarias. Si te fallase el sistema de actualizaciones de WordPress o necesitas el uso de claves privadas/públicas, pues adelante.

Y suhosin hace años que está un poco en desuso. Aunque se plantea recuperar parte de ello, en principio tampoco serían necesarias.

Antes de continuar vamos a preparar PHP para que permita instalar y ejecutar compilaciones de extensiones extra.

Para instalar algunas cosas extra necesitaremos montar PHP para que pueda compilar, lo que significa que necesitamos que PHP tenga permisos de desarrollador… y de paso instalamos el sistema PECL, que permite añadir extensiones extra a PHP.

apt -y install php7.4-dev php-pear pkg-config
pecl channel-update pecl.php.net

Esto nos deja con imagick (para imágenes), memcache (si vas a usar sistema de caché con Memcaché, y en este caso lo dejo aparcado para más adelante) y xdiff para temas de comparaciones.

ImageMagick

La forma más sencilla de instalar el sistema mejorado de imágenes imagick es instalando primero el software principal y su versión de desarrollo, y posteriormente compliando la extensión de PHP.

apt -y install imagemagick libmagickwand-dev
pecl install imagick

Ahora, para que funcione hay que añadir la extensión a PHP. En el caso actual sería algo tal que así:

echo 'extension=imagick.so' >> /etc/php/7.4/mods-available/imagick.ini
ln -s /etc/php/7.4/mods-available/imagick.ini /etc/php/7.4/fpm/conf.d/30-imagick.ini

Ahora hemos de reiniciar PHP (si está en modo FPM) y el servidor web. En ese momento ya tendremos la extensión activa.

xDiff

El sistema es bastante similar al anterior… pero hemos de hacer una serie de pasos previos, ya que hay que compilar una biblioteca.

cd /usr/src
wget http://www.xmailserver.org/libxdiff-0.23.tar.gz
tar -xzf libxdiff-0.23.tar.gz
cd libxdiff-0.23
./configure
make
make install

Tras esto sí que podremos instalar la extensión:

pecl install xdiff

Y finalmente añadirla a PHP y reiniciar el servicio.

echo 'extension=xdiff.so' >> /etc/php/7.4/mods-available/xdiff.ini
ln -s /etc/php/7.4/mods-available/xdiff.ini /etc/php/7.4/fpm/conf.d/30-xdiff.ini

Con esto tendríamos ya PHP configurado para que todo lo que es el núcleo, el propio WordPress, funcione al 100% sin problema y en el Site Health no salga ninguna alerta relacionada con PHP.

Plugins y otras extensiones

Pero no hay que equivocarse, WordPress es muy potente principalmente por los plugin que permiten la extensión de la funcionalidad. Para esta prueba he tomado de base los más populares del repositorio oficial.

Primero voy a poner una lista de aquellos que, con las extensiones que ya tenemos funcionando, pueden ejecutarse sin problema.

  • Contact Form 7 (v5.1.4) requiere PHP 5.3.0
  • Akismet Anti-Spam (v4.1.2) requiere 5.2.0
  • Classic Editor (v1.5) requiere PHP 4.3.0
  • WordPress Importer (v0.6.4) requiere PHP 5.2.11
  • Really Simple SSL (v3.2.5) requiere 5.3.0
  • Elementor Page Builder (v2.7.1) requiere PHP 5.4.0
  • Duplicate Post (v3.2.3) requiere PHP 5.1.0
  • TinyMCE Advanced (v5.2.1) requiere PHP 5.2.0
  • Google Analytics Dashboard Plugin for WordPress by MonsterInsights (v7.8.0) requiere PHP 5.6.0beta1
  • WP Super Cache (v1.7.0) requiere PHP 5.4.0
  • Regenerate Thumbnails (v3.1.1) requiere PHP 5.1.0
  • Google XML Sitemaps (v4.1.0) requiere PHP 5.2.0
  • Advanced Custom Fields (v5.8.3) requiere PHP 5.4.0
  • Autoptimize (v2.5.1) requiere PHP 5.2.0
  • Loco Translate (v2.3.0) requiere PHP 5.5.0
  • Hello Dolly (v1.7.2) requiere PHP 4.0.0 (este es más simple que un botijo)
  • Better Search Replace (v1.3.3) requiere PHP 5.2.0
  • TablePress (v1.9.2) requiere PHP 5.5.0
  • Duplicator – WordPress Migration Plugin (v1.3.20) requiere PHP 7.0.2

En general los plugin que se centran en trabajar con el núcleo de WordPress son bastante estables en cuanto a los requerimientos de PHP. Eso sí, cuando llegamos a algunos plugin más potentes, nos encontramos con otra situación.

Un caso importante es el de Yoast SEO (v12.0) que para funcionar correctamente requiere PHP 7.0.2. Es un plugin muy instalado y usado y que suele requerir siempre la última versión mínima del propio WordPress. Entre las extensiones extra que requiere están laapcu, bcmath, pgsql y sqlite3. No tengo claro para que necesita más extensiones relacionadas con bases de datos (PostgreSQL o SQLite). Lo que sí tiene sentido es la matemática (por temas de mejorar los cálculos). La del APCu puede estar bien por mejorar temas de caché.

En el caso de Jetpack by WordPress.com (v7.7.1) la extensión extra que se nos pide también es la del apcu, que como comentaba, puede venir bien para temas de caché.

Una de las más potentes es WooCommerce (v3.7.0) que tiene unos requerimientos extra bastante amplios. Entre ellos requiere apcu, bcmath y gmp. Aunque tiene unas extensiones extra que no requiere el núcleo de WordPress, en principio ya deberíamos tenerlas instaladas previamente.

Otro de los habituales (y personalmente poco recomendados) es Wordfence Security – Firewall & Malware Scan (v7.4.0) que sigue la línea del uso de apcu, bcmath, gmp y redis. Este último, al igual que memcaché los dejaré para el final.

Otro de los habituales en el mundillo es All in One SEO Pack (v3.2.6) que como extra requiere la extensión OAuth. No acabo de entender para qué, pero personalmente no creo que tenga mucho sentido sobre cargar el sistema con ello.

Otro que requiere elementos que tampoco tienen gran sentido es Contact Form by WPForms – Drag & Drop Form Builder for WordPress (v1.5.5), ya que nos pide apcu.

Uno que pide una extensión curiosa es All-in-One WP Migration (v7.7) un plugin para realizar migraciones. En este caso una de las extensiones que pide es la litespeed, que sólo será necesaria si usamos LiteSpeed como servidor web, y que con el PHP propio de este servidor web ya viene.

Otro de los que pide bastantes recursos es UpdraftPlus WordPress Backup Plugin (v1.16.16) y que tiene cierto sentido y que requiere bastante cálculo. las extensiones que sugiere son apc, apcu, bcmath, bz2, gmp, mhash. Tiene cierta lógica que pida el BZ2 como sistema de compresión, pero no el mhash, que viene ya emulado en el propio hash. El caso de que pida APC y APCu también es curioso, ya que una es una versión mejorada de la siguiente, lo que hace que tenga una retrocompatibilidad hoy en día poco útil.

Un plugin que requiere de muchas conexiones externas y caché es Google Analytics Dashboard for WP by ExactMetrics (formerly GADWP) (v5.3.9) y es por eso que incluye extensiones como apc o las de memcaché.

Otro de los grandes plugins es W3 Total Cache (v0.10.0) que, como tiene sentido, prácticamente requiere todas las extensiones de caché posibles, además de otras relaciionadas con URL. Entre las extensiones extra tenemos XCache, apc, apcu, bcmath, redis, soap, tidy y uri_template. Aquí habrá trabajo para permitir la máxima optimización.

Otro de optimizaciones es WP-Optimize – Clean, Compress, Cache. (v3.0.11) que es de esperar que requierra elementos de caché para optimizar, y por eso tiene funciones para apcu.

Instalando los extra

Hay 3 de las extensiones extra que son bastante fácil de instalar. Es el caso de bcmath, gmp y bz2. Las dos primeras tienen mucho sentido que estén instaladas ya que su principal función es mejorar el sistema de cálculo matemático de PHP. la última tiene que ver con los sistemas de compresión/descompresión de ficheros. En principio con las que ya tenemos sería suficiente (zip y zlib) por lo que, en principio, la dejaremos aparcada.

apt -y install php7.4-bcmath php7.4-gmp php7.4-tidy

En el casos de las caché sí que tenemos varias extensiones a tener presentes. Son tidy (instalada en el comando anterior), apcu, uri_template (es algo bastante obsoleto, por lo que no tiene mucho sentido montarlo), redis y memcache / memcached.

Hay que tener presente que no siempre es necesario tener todos los elementos instalado, y hay que analizar correctamente si tener Redis y memcaché a la vez es necesario o uno de los dos se puede hacer cargo de la caché de objetos del otro. Al final son recursos extra que hay que tener montados en el servidor como servicios añadidos. En cualquier caso, los pasos para instalar estas extensiones es la siguiente, ya que todas son Pecl.

APCu

En principio el sustema de APC no tiene muchos requisitos extra, por lo que instalaremos la extensión y posteriormente la añadiremos a la configuración de PHP.

pecl install apcu
echo 'extension=apcu.so' >> /etc/php/7.4/mods-available/apcu.ini
ln -s /etc/php/7.4/mods-available/apcu.ini /etc/php/7.4/fpm/conf.d/30-apcu.ini

Redis

Si tienes un servidor Redis instalado, esta extensión permitirá a PHP conectar de forma nativa con Redis y poder almacenar datos en este servidor. Para instalarlo (además de instalar Redis) hay que ejecutar lo siguiente:

pecl install redis
echo 'extension=redis.so' >> /etc/php/7.4/mods-available/redis.ini
ln -s /etc/php/7.4/mods-available/redis.ini /etc/php/7.4/fpm/conf.d/30-redis.ini

Memcached

De la misma manera que Redis, Memcached es un sistema externo de caché que requiere su propio servicio / servidor instalado, por lo que para que PHP se pueda conectrar requiere el lugar donde conectarse. Para instalarlo hemos de hacer algo similar a los anteriores:

apt -y install libmemcached-tools libmemcached-dev
pecl install memcached
echo 'extension=memcached.so' >> /etc/php/7.4/mods-available/memcached.ini
ln -s /etc/php/7.4/mods-available/memcached.ini /etc/php/7.4/fpm/conf.d/30-memcached.ini

En cualquier caso, tendremos que reiniciar PHP-FPM y el servidor web.

Qué extensiones tendremos instaladas finalmente

Si hemos instalado todo lo que se ha explicado en este artículo, cuando acabemos la instalación y reinicio de PHP, tendremos esta lista de extensiones incluidas en el sistema, de sobra suficientes para que WordPress funcione al 100%.

  • apcu
  • bcmath
  • calendar
  • cgi-fcgi (al estar como PHP-FPM)
  • Core
  • ctype
  • curl
  • date
  • dom
  • exif
  • FFI
  • fileinfo
  • filter
  • ftp
  • gd
  • gettext
  • gmp
  • hash
  • iconv
  • imagick
  • imap
  • intl
  • json
  • libxml
  • mbstring
  • memcached (requiere uns ervidor Memcached instalado para que sea útil)
  • mysqli
  • mysqlnd
  • openssl
  • pcre
  • PDO
  • pdo_mysql
  • Phar
  • posix
  • readline
  • redis (requiere un servidor Redis instalado para que sea útil)
  • Reflection
  • session
  • shmop
  • SimpleXML
  • sockets
  • sodium
  • SPL
  • standard
  • sysvmsg
  • sysvsem
  • sysvshm
  • tokenizer
  • xdiff
  • xml
  • xmlreader
  • xmlwriter
  • xsl
  • Zend OPcache
  • zip
  • zlib

Qué versión de PHP tener activa

La respuesta, para la versión WordPress 5.2.3 (y para WordPress 5.3.0) tiene una respuesta rápida: PHP 7.2.x. Cualquier versión menor incluye elementos que podrían no ser estándar con elementos, sobre todo de criptografía y que podríamos considerar menos seguros (no digo inseguros) con respecto a versiones anteriores.

Ampliación

EWWW Image Optimizer (v4.9.3): En este caso se llaman a varias extensiones relacionadas con imágenes como gd, gmagick o imagick. En principio la segunda no es necesaria al ser una versión obsoleta y que, con lo que tenemos instalado no requiere de ningún extra.


Sobre este documento

Este documento está regulado por la licencia EUPL v1.2, publicado en WP SysAdmin y creado por Javier Casares. Por favor, si utilizas este contenido en tu sitio web, tu presentación o cualquier material que distribuyas, recuerda hacer una mención a este sitio o a su autor, y teniendo que poner el material que crees bajo licencia EUPL.