En ocasiones puede ocurrir que una actualización de PHP haga que algunas funcionalidades de una aplicación Web dejen de funcionar. Esto es lógico cuando se avanza a una versión superior (por ejemplo si ciertas funciones dejan de ser soportadas), aunque no lo es cuando se trata de una actualización de seguridad, donde se mantiene la misma versión y simplemente se parchan vulnerabilidades. Eso fue lo que me sucedió hoy en un servidor de producción y me obligó a retroceder de versión en unos cuantos paquetes de PHP de manera urgente (shame on Squeeze LTS).
A partir del log de APT (/var/log/apt/history.log
) es posible obtener información acerca de la actualización:
Start-Date: 2015-09-08 07:36:36 Commandline: apt-get -q -y upgrade Upgrade: php5-xsl:amd64 (5.3.3.1-7+squeeze26, 5.3.3.1-7+squeeze27), php5:amd64 (5.3.3.1-7+squeeze26, 5.3.3.1-7+squeeze27), libapache2-mod-php5:amd64 (5.3.3.1-7+squeeze26, 5.3.3.1-7+squeeze27), php5-gd:amd64 (5.3.3.1-7+squeeze26, 5.3.3.1-7+squeeze27), php5-curl:amd64 (5.3.3.1-7+squeeze26, 5.3.3.1-7+squeeze27), php5-pgsql:amd64 (5.3.3.1-7+squeeze26, 5.3.3.1-7+squeeze27), php5-mcrypt:amd64 (5.3.3.1-7+squeeze26, 5.3.3.1-7+squeeze27), php5-cli:amd64 (5.3.3.1-7+squeeze26, 5.3.3.1-7+squeeze27), php5-dev:amd64 (5.3.3.1-7+squeeze26, 5.3.3.1-7+squeeze27), php5-common:amd64 (5.3.3.1-7+squeeze26, 5.3.3.1-7+squeeze27) End-Date: 2015-09-08 07:36:48
Se observa que se actualizó el paquete php5
desde la versión "5.3.3.1-7+squeeze26" a la versión "5.3.3.1-7+squeeze27". No hay cambio de versión, por ende no debería haber cambiado ninguna característica o funcionalidad del motor PHP. Se trata de una actualización de seguridad. Evidentemente algo rompieron al parchar.
También es posible utilizar la herramienta apt-show-versions
:
# apt-show-versions -a -p php5
Desde el momento en que se ha determinado que es necesario retroceder de versión, se puede recurrir al comando apt-cache showpkg php5
para conocer qué otras versiones hay disponibles (si es que hay otras):
Package: php5 Versions: 5.3.3.1-7+squeeze27 (/var/lib/apt/lists/ftp.ca.debian.org_debian_dists_squeeze-lts_main_binary-amd64_Packages) Description Language: File: /var/lib/apt/lists/ftp.ca.debian.org_debian_dists_squeeze-lts_main_binary-amd64_Packages MD5: ef85f921acd1e3c2678691dcdd900acf 5.3.3-7+squeeze19 (/var/lib/apt/lists/ftp.ca.debian.org_debian_dists_squeeze_main_binary-amd64_Packages) (/var/lib/apt/lists/security.debian.org_dists_squeeze_updates_main_binary-amd64_Packages) (/var/lib/dpkg/status) Description Language: File: /var/lib/apt/lists/ftp.ca.debian.org_debian_dists_squeeze_main_binary-amd64_Packages MD5: ef85f921acd1e3c2678691dcdd900acf
La versión instalada ("5.3.3.1-7+squeeze27") proviene del repositorio LTS y está disponible la versión del repositorio Security ("5.3.3-7+squeeze19", anterior).
Para cambiar a la versión anterior, provista por el repositorio Security, ejecutar:
# apt-get install php5=5.3.3-7+squeeze19
De esta forma se está haciendo efectivamente un downgrade, ya que la versión provista por el repositorio Security es anterior.
Lo siguiente consiste en mantener la versión instalada (evitar actualizaciones) hasta tener la certeza de que hayan corregido los errores en la versión más actual. Para ello recurrir al subcomando "hold" de qaptitude
:
# aptitude hold php5
Para comprobar que el paquete está siendo retenido a la versión instalada, ejecutar:
root@debian6:~# aptitude show php5 | grep "State" State: installed [held]
La palabra "held" indica que no será actualizado hasta que deje de ser retenido (aptitude unhold).