¿Alguna vez te has encontrado con un error 500? Seguro que sí, ya que es el segundo más popular después del error 404 (not found) y nos indica que es posible que el servidor tenga algún problema temporal. Pueden producirse por un error de código a la hora de programar y cuando aparecen, no queda más remedio que esperar y probar de nuevo más tarde.
Es muy importante solucionar los errores 5.XX ya que, además de provocar frustración y mala experiencia de usuario, también afectan al SEO. En total, nos podemos encontrar con 11 tipos de errores del servidor:
Estos errores 5XX en los entornos productivos pueden estar provocados por las equivocaciones en el código a la hora de programar, causando gran tristeza y sufrimiento. Al usar expresiones regulares, siempre tenemos que ajustarlas para evitar que sean muy pesadas de ejecutar. Esto es especialmente importante cuando se encadenan varios .+ o .* seguidos. La diferencia en tiempo de ejecución puede ser abismal, de varios segundos a unas pocas centésimas, sobre todo cuando el texto a matchear es relativamente grande (por ejemplo, el body de un contenido).
Es lo que nos pasó en uno de nuestros clientes, cuando algunas páginas de AMP estaban dando error 504 porque tardaban demasiado tiempo en generarse. Tirando del hilo, vimos que el problema es que se atascaba al hacer varios preg_match de este tipo:
Si se analiza la expresión regular, el código matchea párrafos HTML que contengan imágenes. Ejecutar ese preg_match contra el body de una noticia algo extensa tarda varios segundos. El motivo de esa lentitud es que estamos usando varios .* y .+ en la misma regexp, y esto provoca que cueste muchísimo evaluarlos, debido a la cantidad de backtracks que tiene que hacer el motor de expresiones regulares.
Si cambiamos varios de esos .* (cualquier carácter, repetido 0-N veces) por algo más específico como [^>]* (cualquier carácter salvo >, repetido N veces), la expresión regular resultante es muchísimo más rápida. Para los .* que no podamos hacer más específicos, usaremos el modificador ? (not greedy).
Regex101 es una de las mejores herramientas para probar y depurar expresiones regulares en línea. Gracias a esta consola interactiva, puedes crear tus expresiones y ver cómo afecta a un conjunto de datos en vivo, todo en una pantalla al mismo tiempo.