RadioWordPress #32: Mejora la velocidad de carga de WordPress un 50%

La versión de php afecta drásticamente al rendimiento de vuestro WordPress, quizás no seáis conscientes de cómo afecta la versión de php de vuestro servidor, pero creedme si os digo que es un factor crítico a tener en cuenta.

Me pasa mi compañero en Tecnocrática Adrian un enlace al blog de Mattias Geniar https://ma.ttias.be/wordpress-php-7-1/ en el que hacía unas pruebas para ver cual era impacto de la versión de php sobre nuestro WordPress y el resultado era aplastante, php 7.1 afectaba al rendimiento muchísimo.

En su entrada del blog Mattias Geniar hace unas pruebas de rendimiento, así que decidí reproducirlas en mi servidor de Neodigit, un servidor cloud con panel, exactamente igual que cualquier otro que haya.

En mi caso mi servidor cloud tiene 2 cores y 4 gigas de RAM, pero es un servidor con TCPanel normal, como el que cualquiera puede contratar, no os penséis que es diferente a lo que hay por defecto.

Aunque el servidor soporte las versiones 5.2, 5.3, 5.4, 5.5, 5.6, 7.0 y 7.1 para emular las pruebas de Mattias sólo voy a hacer las pruebas con las versiones de php mantenidas, es decir, la 5.6 que se encuentra en soporte extendido, es decir, solo actualizaciones de seguridad, la 7.0 y la 7.1 que están en mantenimiento actualmente.

Por supuesto para poder hacer las pruebas de php es necesario no hacer trampas, así que voy a desactivar las opciones de caché de los plugins de WordPress.

Antes de hacer las pruebas de todos modos he comprobado los problemas que puede dar el actualizar a php 7.1, como el Neodigit el cambio de versión de php se puede hacer al vuelo lo que he hecho ha sido simplemente poner versión 7.1 y no he notado ningún error ni visto nada en los logs de errores de apache, así que a priori parece que nada ha dejado de funcionar y que todo funciona correctamente.

Tener en cuenta que ya probé anteriormente actualizar a la 7.1 y tuve algún problema con jetpack, pero parece que ya quedó solucionado.

Bueno, ¿vamos a empezar con las pruebas?

Antes de nada y lo primero será desactivar cualquier plugin de caché, así que desactivando estos plugins. En mi caso estoy haciendo las pruebas con un subdominio de pruebas que no tiene nada instalado, ningún plugin, nada,es decir WordPress puro para que podamos ver mejor las diferencias.

Ahora vamos a cambiar en el panel de Neodigit la versión de php a php 5.6.

Ahora vamos a ejecutar el benchmark que nos sugiere Mattias con dos conexiones concurrentes y 300 peticiones, a ver qué datos nos da, ejecutaremos el comando ab -c 2 -n 3000 y la URL.

ab -c 2 -n 300 https://URL

Ya le hemos dado y esto va a tardar un ratito, así que vamos a hacer la mágia del podcast y vamos a parar el audio y seguimos ahora, en cuanto termine.

El resultado de las pruebas completas os las dejo en la transcripción del programa.

root@host0v1b21-a82.neodigit.net ~ # ab -c 2 -n 300 http://subdominio/blog/2017/02/19/hola-mundo/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking subdominio (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Finished 300 requests


Server Software:        Apache
Server Hostname:        subdominio
Server Port:            80

Document Path:          /blog/2017/02/19/hola-mundo/
Document Length:        57598 bytes

Concurrency Level:      2
Time taken for tests:   76.609 seconds
Complete requests:      300
Failed requests:        0
Write errors:           0
Total transferred:      17379000 bytes
HTML transferred:       17279400 bytes
Requests per second:    3.92 [#/sec] (mean)
Time per request:       510.727 [ms] (mean)
Time per request:       255.363 [ms] (mean, across all concurrent requests)
Transfer rate:          221.54 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       2
Processing:   430  510 139.1    466    1573
Waiting:      429  509 139.0    466    1573
Total:        430  510 139.1    466    1573

Percentage of the requests served within a certain time (ms)
  50%    466
  66%    485
  75%    518
  80%    538
  90%    591
  95%    643
  98%   1030
  99%   1365
 100%   1573 (longest request)

Ahora vamos a hacer la prueba con PHP versión 7.0 a ver qué tal

root@host0v1b21-a82.neodigit.net ~ # ab -c 2 -n 300 http://subdominio/blog/2017/02/19/hola-mundo/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking subdomino (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Finished 300 requests


Server Software:        Apache
Server Hostname:        subdominio
Server Port:            80

Document Path:          /blog/2017/02/19/hola-mundo/
Document Length:        57598 bytes

Concurrency Level:      2
Time taken for tests:   50.236 seconds
Complete requests:      300
Failed requests:        0
Write errors:           0
Total transferred:      17379000 bytes
HTML transferred:       17279400 bytes
Requests per second:    5.97 [#/sec] (mean)
Time per request:       334.907 [ms] (mean)
Time per request:       167.454 [ms] (mean, across all concurrent requests)
Transfer rate:          337.84 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       2
Processing:   288  334 102.6    312    1371
Waiting:      288  334 102.6    312    1370
Total:        288  334 102.7    312    1373

Percentage of the requests served within a certain time (ms)
  50%    312
  66%    317
  75%    320
  80%    322
  90%    346
  95%    461
  98%    761
  99%    895
 100%   1373 (longest request)

Y ahora vamos a hacer la misma prueba con PHP versión 7.1 y luego comentamos las diferencias

root@host0v1b21-a82.neodigit.net ~ # ab -c 2 -n 300 http://subdominio/blog/2017/02/19/hola-mundo/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking subdominio (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Finished 300 requests


Server Software:        Apache
Server Hostname:        subdominio
Server Port:            80

Document Path:          /blog/2017/02/19/hola-mundo/
Document Length:        57598 bytes

Concurrency Level:      2
Time taken for tests:   50.916 seconds
Complete requests:      300
Failed requests:        0
Write errors:           0
Total transferred:      17379000 bytes
HTML transferred:       17279400 bytes
Requests per second:    5.89 [#/sec] (mean)
Time per request:       339.439 [ms] (mean)
Time per request:       169.720 [ms] (mean, across all concurrent requests)
Transfer rate:          333.33 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       2
Processing:   290  339 119.9    317    1494
Waiting:      290  338 119.9    317    1494
Total:        291  339 119.9    318    1494

Percentage of the requests served within a certain time (ms)
  50%    318
  66%    323
  75%    327
  80%    329
  90%    347
  95%    430
  98%    659
  99%   1298
 100%   1494 (longest request)

Una vez hechas las pruebas vamos a proceder a compararlas.

Lo primero será comparar el tiempo de ejecución total de las 300 peticiones hechas de 2 en 2 concurrentes:

En php 5.6 ha tardado 76.609 segundos, php 7.0 ha tardado 50.236 y php 7.1 ha tardado 50.916, es decir, en php 5.6 ha tardado aproximadamente un 50% extra del tiempo que php 7, entre las dos versiones de php la desviación es insignificante.

Con esta simple prueba ya vemos que el pasar a php 7 no es una opción sino una necesidad