Antiguo y abandonado blog de Ricardo Galli :-(

Tuesday 26/9/2006

Plantillas PHP: there is no silver bullet

Filed under: menéame, Trucos, Hackerdom — gallir @ 23:31

Después de mi mala experiencia en este sentido con WP y el desarrollo y éxito del wp-cache, y darme cuenta como un código tan “pesado” puede echar al traste a cualquier blog, cogí una obsesión casi paranoica con la eficiencia del código y evitar a toda costa las “capas adicionales”, estaba convencido que daban mucha “elegancia” al código y a la “arquitectura”, pero sólo un poco –muy poco– de facilidad real de adaptación.

Así fue que al comenzar el menéame me puse como prioridad el generar un código muy eficiente, que no sea una mezcla espagueti de HTML y PHP –es decir que tenga el “aspecto” de un programa de verdad–, y que sea mínimamente adaptable y traducible.

Eso me llevó a evitar a las plantillas como la peste –aunque se decía que el Smarty era muy eficiente y ligero–, programar toda la salida a base de echo()/print(), usar el GNU Gettext para facilitar las traducciones [1], e intentar definir todo el aspecto sólo en el CSS.

[1] Además hice el original en castellano porque estaba cansado de que durante toda mi “vida profesional” y de participación en proyectos de software libre el uso del inglés era un pre-requisito, llegó un punto donde cometía menos errores en inglés que en castellano.

Al principio una de las críticas más duras que recibía fueron por no haber usado plantillas. Cuando Pligg hizo su fork temprano –y sin avisar– del menéame (pocos días después de que se haya puesto en marcha el menéame.net), lo primero que hicieron fue adaptarlo al Smarty.

Allí empecé a dudar seriamente de si me decisión había sido la correcta.

Esa duda se fue desvaneciendo con el aumento del número de visitas y páginas generadas –que ya superamos los 2.000.000 diarios, como comenté en el apunte anterior– y observar cómo era capaz de servir tantas páginas por minuto (unas 30 y poco por segundo de la página índice, entre 80 y 90 de una noticia).

Pero aún así tenía mis dudas…. hasta que me enviaron un enlace donde discutían un nuevo fork del menéame (Getgui), donde uno de los autores explica las razones que le llevaron a alejarse de Pligg (y volver a las fuentes :-) ):

Pligg is a messed up version of Meneame circa December 2005. Pligg chose to add Smarty with the idea Smarty would make Pligg template ‘friendly’. Unfortunately it didn’t work out that way. Yes, Pligg’s templating system is easier to work with then PHP files and no guide, but Smarty radically slows down Pligg, and so IMO the cost was too high. Just compare these two sites for speed: www.meneame.net and www.inboxnews.com.

Since December ‘05 Meneame has added many features such as Karma, Avatars, a nice user profile center, and fine tuned the PHP so it runs fast. I’m currently installing a copy here if you’d like to take a look: http://www.getgui.com. Note I’ll be adding the English translation file later this evening.

O sea.

Podría ocurrir que dediques mucho esfuerzo en usar plantillas, y el resultado podría ser que código no tenga el rendimiento que deba tener, o que se necesites mucha más infraestructura para aguantar el mismo tráfico.

Pero lo peor es que también podría no facilitar mucho más adaptar el diseño, y que además te retrase el desarrollo de lo “importante”: lo que los usuarios necesitan o piden, no las pajas de los programadores encerrados en su escritorio y sin tener idea del user requirements, sencillamente porque todavía no aparecen los libros. Y cuando lo hagan ya estará más que visto y resuelto.

Lo de siempre, en el software there is no silver bullets –en buen castizo: “no hay soluciones mágicas”–. Y el sentido común a veces es imprescindible –más que la elegancia interna de la “arquitectura”– para tomar esas decisiones críticas de un proyecto de software.

27 Comments

  1. Yo personalmente hubiera optado por el patrón de diseño MVC, lo he estado utilizando mucho junto con PHP y no echo en falta plantillas ni historias.

    La reagrupación del codigo en tres capas te evita el codigo espaghetti que comentas y tan usual en aplicaciones PHP, la vista toda con CSS y cacheada si es necesario. Mano de santo.

    Te invito a que le eches un ojo a CakePHP a ver que te parece http://www.cakephp.org

    Comment by Moisés — Wednesday 27/9/2006 @ 0:20

  2. Moisés, esos frameworks seguramente generan código mucho más “pesado” incluso que las plantillas. No conozco el que dices, pero conociendo al rails y un poco cómo van, debe ser algo similar. De todas formas lo miraré.

    Respecto al tema de cache, en el menéame no se pueden cachear las páginas por varios motivos. El principal es que se tiene que ver para _cada_ usuario si puede o no votar la noticia, esto sólo imposibilita cachear una página (o gran parte de ella). Además los votos cambian frecuentemente lo que no permite que se puedan tener cache mucho tiempo.

    Al final cualquier sistema de “cache parcial” tomaría más ciclos de reloj y latencia que hacerlo directamente aprovechando las consultas que ya se hacen para los votos.

    Comment by gallir — Wednesday 27/9/2006 @ 0:34

  3. Sin embargo una cosa que llama la atención es que para el acceso a la base de datos si que utilizas un frontend (ezSQL) en un sector que tal como cuentas consideras crítico.
    Aunque usas una versión más antigua no se si por temas de eficiencia al estar menos bloated o por no cambiar lo que ya está metido.

    Comment by PerroVerd — Wednesday 27/9/2006 @ 0:36

  4. Perroverd, alguno tenía que usar para la bbdd (sino es un auténtico merdè).

    El frontend ese es muy ligero y muy cómodo. Estaba en la duda de usar ese o el que usamos en Bulma (y que usé en bastantes otros proyectos). Pero hice pruebas y hasta me parece que este iba mejor.

    Tiene un sólo problema importante, el consumo de memoria si los resultados son largos (y grandes), pero eso lo he evitado y lo he tratado con mucho cuidado.

    Es muy cómodo porque no tienes que hacer bucles “no nativos php” para recorrer todas las filas, se soluciona con el foreach ( x as y) de toda la vida.

    Y no, no usé la nueva versión porque hay muchos cambios y me pareció pesada (y no le descubrí grandes ventajas para lo que necesitaba).

    Comment by gallir — Wednesday 27/9/2006 @ 0:43

  5. Yo tengo mi pseudoproyecto de CMS y pasé por la misma decisión: Templates o PHP, y me decidí por armar mis “templates” por medio de includes de PHP.

    Así de “feo”, pero pude separar código de HTML fácilmente, el problema es que nunca pude medir cuanto tiempo le lleva hacer esos includes, pensar que en cada comment hace un include del template del comment. En fin, yo creo que es un CPU-violador, pero tendría que cambiar cada PHP del template para que haga un $sHTML = “”; con el contenido de HTML y de ahí se haga un echo al estilo de Menéame.

    ¿Cuanta memoria consume tener todo el template en una hermosa y violenta variable? yo creo que mucho, por eso no quise meter todo en una serie de variables y de ahí ir “dibujando” el HTML para imprimirlo al final.

    ¿que sería mejor?

    En mi caso es así:

    include del header
    include del cuerpo
    include de cada post (n)
    include del menú
    include del pie

    el código va separado de cada PHP incluído, pero no necesito aprender todo un lenguaje nuevo de template como Smarty, simplemente uso PHP si necesito alguna pequeñez en el template.

    esto, obviamente, no es cacheable como lo sería con el wp_cache

    Comment by Fabio — Wednesday 27/9/2006 @ 0:45

  6. Not so Smarty

    Ricardo Galli tiene razón, si usas Smarty, el impacto en el desempeño es alto. He leido por ahí que Smarty es eficiente, pero seguramente hay que ser un gurú del mismo para lograr lo prometido. En el caso de Blogmemes,…

    Trackback by La Naturaleza del Software — Wednesday 27/9/2006 @ 1:45

  7. Hombre, teniendo en cuenta el doloroso camino que ha tenido meneame hasta llegar a un hosting que soporte la demanda que tiene el sitio. Creo que el problema no es plantillas sí, plantillas no. Habría que evaluar las características de la máquina donde está inboxnews, y de donde está meneame.

    “Podría ocurrir que dediques mucho esfuerzo en usar plantillas, y el resultado podría ser que código no tenga el rendimiento que deba tener, o que se necesites mucha más infraestructura para aguantar el mismo tráfico.”

    Por supuesto que podría ocurrir eso, ahora bien, ese tipo de situaciones hay que evaluarlas sin prejuicios tanto por una como por otra opción.

    Los sistemas de plantillas en general, y Smarty en particular, son una solución enormemente recomendable a la hora de iniciar un proyecto web.

    En cuanto a, getgui, ahora mismo más que un fork del código de meneame parece un clon. Que bueno, el proyecto es nuevo y se le añadiran esas características poco a poco, pues vale. Pero ahora mismo las imagenes que hay en la galeria de supergu no se corresponden con la imagen de getgui.

    Comment by ^_^ — Wednesday 27/9/2006 @ 1:50

  8. Todo lo que sea parecido a menéame y termine con “i” me trae mala espina ;).

    Fuera de broma, esto con .NET y MSXHTML y MSSQL no tienes problemas.

    ;)

    Comment by mini-d — Wednesday 27/9/2006 @ 2:57

  9. #7, en el «doloroso camino que ha tenido meneame hasta llegar a un hosting que soporte la demanda que tiene el sitio» hubo el Xen y lo que supone: compartir equipo.

    Comment by Benjamí — Wednesday 27/9/2006 @ 3:13

  10. Está claro que el rendimiento siempre va a ser mejor si no se utiliza ningún sistema de plantillas, pero tampoco creo que un sistema de plantillas (o Smarty en concreto) no se pueda utilizar en sites de mucho tráfico. En el caso de Smarty hay sites de mucho tráfico que lo utilizan, sin ir más lejos Loquo, y dicen que Flickr también (aunque si esto es cierto, seguro que tienen un Smarty muy “tuneado” que en poco se parecerá al original).

    Creo que la principal ventaja de utilizar un sistema de plantillas es que te obliga a separar la capa de presentación de la capa de negocio, algo que por supuesto también se puede conseguir haciendo todo “desde cero”, pero la tentación es más grande y hay que ser muy disciplinado.

    Desde luego no son un “silver bullet”, pero estoy con ^_^ en que para la mayoría de proyectos web es muy recomendable utilizar un sistema de plantillas. Aunque por supuesto habrá casos, como puede ser meneame, en los que no sea aconsejable.

    Por si a alguien le interesa, os dejo el enlace a TemplateLite, una versión reducida del Smarty (de hecho al principio se llamaba SmartyLite, pero les obligaron a cambiar el nombre) a la que le faltan algunas funcionalidades pero tiene un consumo de memoria mucho menor que Smarty y es algo más rápido.

    Comment by Iñaki — Wednesday 27/9/2006 @ 9:42

  11. Al #7, como dice Benjamí, el problema del Xen no tenía que ver con rendimiento (de hecho por 50 dólares soportábamos 30.000 visitas diarias) sino con inestabilidad. El equipo moría cada pocos días, dejándonos hasta la BBDD hecho una mierda.

    Comment by gallir — Wednesday 27/9/2006 @ 9:43

  12. WordPress y su excesivo consumo, WP-Cache y la optimización de herramientas web

    Ayer por la noche Ricardo se descolgaba con Plantillas PHP: there is no silver bullet sobre obtener la máxima optimización en las herramientas y desarrollos vía web…

    Recuerdo que cuando empezó con WP-Cache llamaba al código del WordPress &#…

    Trackback by SigT — Wednesday 27/9/2006 @ 14:23

  13. #9 y #11, bueno parece que no he expresado lo que queria decir. Lo que pretendía decir es que el hosting del meneame tiene unas características muy superiores al hosting de inboxnews. No tengo ni idea de donde está alojado ahora mismo meneame (si es dedicado, compartido,…), pero sí sé que hubo una época en la que no funcionaba ni remotamente tan bien como ahora. Dada la cantidad de votos necesarios, para que una noticia salga en portada, en meneame y en inboxnews; los 10.000 y pico usuarios de meneame y los 800 y pico de inboxnews, me inclino a pensar que “esa lentitud” a la hora de servir las páginas obedece más a la calidad del hosting que al consumo del sistema de plantillas.

    Los desarrolladores de Supergu inicialmente pretendian hacer un fork de Pligg y luego cambiaron de idea prefiriendo usar meneame como base de su fork esa es toda la historia que le veo al hilo de ese foro. Si se aportaran datos sobre, cosa que no se hace, con y sin Smarty eso ya sería otra cosa.

    #11, he vuelto a releer la anotación y ciertamente el penúltimo parrafo “Pero lo peor es que también podría no facilitar mucho más adaptar el diseño…” creo que hace una afirmación peligrosísima. Puede que necesite algo más de reflexión.

    Comment by ^_^ — Wednesday 27/9/2006 @ 17:22

  14. Al #13: mira en #6 otra opinión sobre el Smarty (es del autor de Blogmemes, que lo ha usado).

    > creo que hace una afirmación peligrosísima. Puede que necesite algo más de reflexión.

    No le veo lo “peligrosísima”. En primer lugar porque el verbo usado es “podría”, y en segundo lugar porque no está claro que lo facilite, por lo menos hay evidencias como el caso del Pligg y este nuevo fork… y la cantidad de clones del menéame que no han tenido demasiada dificultad en adaptar diseño (hay algunos muy guapos, como el indio).

    Comment by gallir — Wednesday 27/9/2006 @ 18:30

  15. #7 (último párrafo) Por lo que he leído, la gente de supergu/getgui tiene que empezar casi de nuevo con lo que hacían, ya que más que otra cosa la mayoría de sus “mejoras” son estéticas. Por lo tanto lo que han puesto, en efecto no es más que un miserable clon. Habrá que ver como evoluciona.
    Es recomendable entrar y leer en sus foros, ya que allí también se menciona el SmartyLite, que creo que el autor lo rechaza.
    Por otro lado, Ricardo, supongo que lo habrás leído, pero también mencionan al sistema de plantillas de WP, que desconozco como funciona. Me gustaría saber que opinas de ese sistema también, ya que el menda este compara un poco el rendimiento de WP y MNM.
    Curioso las cosas que se encuentra uno en su busqueda de clones (seguro que seguirán apareciendo perlas como estas).
    Saludinhos.

    Comment by Demian — Wednesday 27/9/2006 @ 20:07

  16. Bueno, yo veo como un compromiso el tema de las plantillas, MVC,… más adaptabilidad de la aplicación, más máquina para ejecutarlo; a más capas, menor rendimiento, pero mejor mantenimiento.
    Hay proyectos de miles de htmls, xmls, sqls, confs,etc, etc… que con solo pensar en un fichero debes poder localizarlo, conocer su utilidad, el alcance que puede tener su modificación. De otra manera sería imposible tener a veinte tios trabajando en el mismo proyecto.

    Comment by Joserra — Wednesday 27/9/2006 @ 20:31

  17. #15 Sí, eso mismo entendí yo. Lo de TemplateLite (SmartLite) no lo ví aunque no me extraña cuando han decidido no partir de Pligg. Además en cuanto ví eso posibilidad de plugin y lo de las plantillas de WP se me cambaron los ojos, pero bueno ya veremos en que queda.

    #14 Ya había visto la entrada en su bitacora esa hablando de que le consume el 80% del rendering. Lo que me gustaría es saber como llegó a esa medida. Aunque, bueno, igual bajo akarrú este fin de semana y me pongo a jugar con él; bueno a saber si hay tiempo y ganas.

    Verás, encuentro peligroso ese parrafo. Pues, porque en el contexto de la anotación, al final, me quedo con el mensaje las plantillas son una mierda. Aquí supongo que te lee mucha gente, en especial estudiantes de informática, y me parece un error que se queden con ese mensaje.

    ¿Cuándo hablas del indio te refieres a http://www.indianpad.com/ ? Si es ese, en efecto han hecho un gran trabajo modificando el código de meneame. Se nota que han modificado bastantes cosas, y les ha quedado muy bien es cierto. Pero bastantes de clones que hay señalados en http://meneame.wikispaces.com/Clones lo que tienen realmente instalado es pligg, lo sé porque los acabo de mirar todos. El código está ahí para quien quiera y pueda cambiarlo, eso está claro. Pero la impresión que me ha dado es que la gran mayoría de los clones de meneame juegan con las css y poco más; aunque realmente hay más de un caso en el que han currado bastante más llegando a un resultado más que notable.

    Leer esto con humor que no veas lo que me choco al verlo. “123 http://www.telecomunicaciones.es (telecomunicaciones - español)” por mucho que se empeñe quien lo puso elpais.es no es un clon de meneame.

    Bueno, antes de que esto se extienda. Me gustaría dejar claro que mi intención no es criticar el código tanto de meneame o cualquier otro clon que aparezca. Y mucho menos menospreciar todo el trabajo que hay detrás de ellos, que es enorme. En especial, porque leo los feeds de esta bitacora, meneame que más de una vez he visto algún post noctámbulo de Ricardo hablando de los problemas que daba el hosting, de alguna característica que se le había añadido, o algún bug que se había corregido.

    Comment by ^_^ — Wednesday 27/9/2006 @ 22:48

  18. > #14 Ya había visto la entrada en su bitacora esa hablando de que le consume el 80% del rendering. Lo que me gustaría es saber como llegó a esa medida. Aunque, bueno, igual bajo akarrú este fin de semana y me pongo a jugar con él; bueno a saber si hay tiempo y ganas.

    Mira en http://www.blogmemes.com/test_index.php

    Según el propio Eduardo Diaz (no he verificado los datos):

    “Al final de la pagina aparecen 3 valores, en segundos, el primero es el que toma cargar el archivo common.php que tiene todas las inicializaciones y configuraciones, el segundo tiene el tiempo que demora las consultas a la Base de Datos (mysql), y el tercer numero es el tiempo que demora smarty en desplegar la información.”

    > Verás, encuentro peligroso ese parrafo. Pues, porque en el contexto de la anotación, al final, me quedo con el mensaje las plantillas son una mierda. Aquí supongo que te lee mucha gente, en especial estudiantes de informática, y me parece un error que se queden con ese mensaje.

    No, no, no, todo lo contrario. Un estudiante _tiene_ que pensar, y se tiene que dar cuenta que no existen las soluciones mágicas, y que las plantillas PHP _podrían_ no ser la solución idónea para lo que hace.

    No entiendo cómo una afirmación del tipo “hay que pensar, hay que analizar, no te fíes del “hype”" podría ser peligroso. Todo lo contrario.

    En ningún momento digo que las plantillas no sirvan para nada, sino que hay que hacer un análisis de costo-beneficio, y tener en cuenta que tiene su costo. Y que no es bajo. Y que además en Internet hay que pensar que tu web podría tener picos de tráfico inesperados.

    Respecto a http://www.telecomunicaciones.es no lo entiendo, ese es el código del menéame.

    Comment by gallir — Wednesday 27/9/2006 @ 23:04

  19. #18 entra en el wiki y pincha en el enlace desde allí, luego lo entenderás. De verdad, me salta la página del país.

    Comment by ^_^ — Wednesday 27/9/2006 @ 23:12

  20. Juas….. ya lo veo, el enlace pone http://http//www.telecomunicaciones.es y tu navegador te redirige a El Pais… cosas de Google supongo :-)

    Comment by gallir — Wednesday 27/9/2006 @ 23:17

  21. “Al final de la pagina aparecen 3 valores”
    Ya lo ví. Bufff, que barbaridad. Parece que el problema es que no cachea las plantillas y compila la plantilla con cada petición. Esos tiempos con Smarty solo los he visto precisamente en ese momento cuando compila la plantilla.

    “hay que pensar, hay que analizar, no te fíes…”, sí esta afirmación la encuentro del todo correcta. Pero el caso como te decía antes no es con ese sabor de boca con el que me quede al leer la entrada. El mensaje con el que me quede fue, como dije antes, “…las plantillas son una mierda…”. Jeje bueno, eres profesor y estarás deacuerdo que estudiante y pensar son términos que muchas veces no van unido. Pero eso es otro tema.

    “En ningún momento digo que las plantillas” Bueno el costo no es tan alto como en Blogmemes, allí es que algo está mal configurado. Y las ventajas son enormes. Desde mi primer comentario creo que esa fue la idea que exprese, que primero hay que analizar para saber que es lo que supone. El problema según lo veo es que has llegado a esa conclusión con al menos una de las premisas iniciales, según mi opinión, erronea. El “Just compare these two sites for speed” del comentario del foro. No se puede hacer esa comparación tan alegremente sino se trata de maquinas y condiciones iguales, que es por lo que venía mi poco afortunado comentario de “doloroso camino…”

    Comment by ^_^ — Thursday 28/9/2006 @ 0:00

  22. Volviendo a programar como antes

    Me acuerdo que cuando comencé a programar, allá por el 1996 con Basic, se cuidaba cada línea de código, cada variable, cada campo para que no ocuparan más espacio del que se debiera. Recuerdo armar las estructuras de los archivos para que sean lo …

    Trackback by UnLugar — Saturday 30/9/2006 @ 20:23

  23. Desde mi punto de vista, el problema con sistemas de plantillas como Smarty es que
    terminan implementando todo un “parser” con php y un lenguaje interpretado es muy
    ineficiente para eso. Además, un sistema de plantillas no debiera ser mucho más que
    un sistema de “rellena hoyos” con la capacidad de iterar un bloque por medio de php.

    En ese sentido, me han parecido muy interesantes las de

    http://sourceforge.net/projects/php-templates/

    No podría yo juzgar realmente su eficiencia pero, su gran ventaja a mi parecer sobre
    los demás sistemas, es que se trata de código C y no php, implementado como una extensión
    a PHP.

    En mi opinión, ésta (parser en C) es una vía que casi no he visto y que potencialmente puede
    ser muy eficiente.

    Comment by olaf — Tuesday 3/10/2006 @ 22:15

  24. Con respecto a lo que dice #21, lo que pasa es que para blogmemes no tiene sentido el cache.
    De hecho, un usuario trato de usar cache en otra instalacion de blogmemes y se generaron muchos problemas.
    A diferencia de meneame, en blogmemes el calculo para la promoción se realiza en forma “interactiva”, y no mediante un proceso externo, es decir, cada vez que hay un hit en blogmemes se calculan los valores que promueven las noticias hacia la primera página, y que mueven las noticias más viejas a la cola.
    Si usaramos cache, no se reflejaría esto.
    La verdad es que Smarty está muy bien para un blog, o sitios no tan dinámicos como meneame o blogmemes.

    Parafraseando un poco, “sí hay balas de plata, sólo que sirven para los hombres lobos, pero para los vampiros es mejor usar una estaca de madera”.

    O sea, hay aplicaciones en que tiene mucho sentido usar Smarty, pero no veo que sea muy práctico en los proyectos que estamos discutiendo.

    Comment by Eduardo Diaz — Wednesday 11/10/2006 @ 1:03

  25. Plantillas PHP: there is Silver Bullets

    Sí hay balas de plata, pero las balas de plata sirven con los hombres lobo. Para matar un vampiro mejor usar una estaca. Este post tiene que ver con la interesante discusión con respecto al uso de Smarty. No es…

    Trackback by La Naturaleza del Software — Wednesday 11/10/2006 @ 1:20

  26. Slash (escrito en perl) utiliza como sistema de templates Template-Toolkit.

    ¿Alguien puede aportar algún dato sobre la performance de Slash?

    Comment by Javier Smaldone — Tuesday 17/10/2006 @ 17:23

  27. El Slashcode tiene muchos problemas de rendimiento, por eso hace uso intensivo de caches.

    En el menéame no se puede hacer lo mismo, por el control y visualización del estado de los votos para cada uno de los que acceden a cada página.

    Comment by gallir — Tuesday 17/10/2006 @ 17:43

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress