Archive for the 'Programacion' Category

[MS] Que es mi Content-Type!, que te lo digo en serio!

Sunday, July 6th, 2008

No conformes con las cosas horribles que le pasan a Windows Vista y su pronto reemplazo por Windows 7 (o Windows Seven plagues como algunos ya lo llaman; el vaticinio del fin del mundo); la fiebre de soluciones “Chaborras” e ilusas ahora viene de la mano de la gente de Internet Explorer 8.

Si; este es mi content-type; que te lo digo en serio!

Durante milenios los documentos han viajado de los servidores hasta el navegador de una manera más o menos igual; el documento declara un tipo de contenido (Content-Type + charset) y aun así; los navegadores son algo desconfiados y echan una “mirada” al documento; sin embargo, es renderizado “tal cual es” sin ningún inconveniente; esto ha sido el comportamiento “por defecto” de absolutamente todo el mundo menos la gente “desvergonzada” de Redmont.

Al parecer su manía de desconfiar de cualquier código que no sea generado por ellos mismos (y si es generado por ellos; más desconfían) los hace “tratar de interpretar” el contenido obviando “olímpicamente” la declaración de Content-Type y enviando el contenido a los distintos “parsers” de acuerdo a su contenido; esto podría sonar interesante cuando se trata por ejemplo de imágenes (donde por lo general nadie declara el type) pero si dentro de un bloque en vez de contenter text/xml colocamos código javascript; en vez de ser enviado a pantalla (como debería ser, es un código javascript declarado como texto; como si lo colocara dentro de un <PRE>) este es ejecutado; siendo la total maldición de los sitios web y de los ataques de “MIME-sniffing”.

Para algo que es una “aplicación” habiamos inventado una declaración “application/xhtml+xml” esta permite indicar que nuestra página es una aplicación XML que combina HTML y otros “lenguajes” como javascript”; pero antes de IE7 los navegadores microsoft asumían esa declaración como un “binario” e intentaban descargar la página; ¿Como lo solventaban los desarrolladores para IE?; colocando 2 declaraciones Content-Type; una haciendo referencia a application/xhtml+xml y otra para IE de text/html.

Observen este “burdo” ejemplo de como las “cosas” se pasan por alto dentro de la casa de Redmont:

Con un bloque como:

HTTP/1.1 200 OK
Content-Length: 108
Date: Thu, 26 Jun 2008 22:06:28 GMT
Content-Type: text/plain;

<html>
<body bgcolor=”#AA0000″>
This page renders as HTML in IE7/IE8.
</body>
</html>

Como vemos; el content Type es “text/plain”; eso significa que “DEBERIA!” renderizarse como texto; pero la presencia de etiquetas HTML hace que IE7 e IE8 “interpreten” el contenido y lo envíen a pantalla.

En medida de seguridad; esto significa que un bloque de texto, conteniendo código Javascript (Jscript de MS) o VBScript será ejecutado en vez de ser “renderizado como texto”.

La burda solución de IE8? … inventarse una “declaración HTTP” indicando de que “en verdad” hay que hacerle caso al servidor y asumir el content-type como cierto; Authoritative=true:

HTTP/1.1 200 OK
Content-Length: 108
Date: Thu, 26 Jun 2008 22:06:28 GMT
Content-Type: text/plain; authoritative=true;

<html>
<body bgcolor=”#AA0000″>
This page renders as HTML source code (text) in IE8.
</body>
</html>

Nos les parece estúpido?; no le hago caso al content-type declarado; pero si a una declaración autoritativa?; si puedo “falsificar” una declaración de “content-type” ahora puedo “OBLIGAR” al navegador a no “intentar” analizar el contenido y a confiar en mí; si antes podía meter droga en la casa escondida en una caja de pizza; ahora con solo decir “Si mamá; es pizza” ella no revisará la caja y pasaré tranquilo con lo que desee entrar.

La idea es simple; HTML 5 obliga a los navegadores a obtener los primeros 512 bytes del documento e intentar analizar (via la cabecera del documento) todo el contenido de la página e informar al usuario de cualquier posible “discordancia” con el contenido; cualquier contenido “mal declarado” deberá ser tratado como text/plain o text/html y no “ejecutado” como viene haciendo IE7 (de hecho; HTML5 OBLIGA al UA (navegador) a informar al usuario de que un “contenido” está intentando ejecutarse cuando no debería; lo cual viene haciendo Firefox y otros navegadores como Opera hace tiempo); pero en vez de seguir con la corriente; con Authoritative=true la gente de IE8 se estará ahorrando el tener que escribir toda esta “mega-implementación” de interpretación y errores de excepción y “pasar a confiar en el servidor” sin tratar de analizar nada.

Es decir; no solo quieren seguir con el jueguito de “todo lo que me llegue lo ejecuto”; sino que además; “si el server me dice que EN SERIO debo ejecutarlo; entonces más lo haré sin chistar!” …

Cada día da más escalofríos pensar que será de Windows 7 e Internet Explorer en un par de años …

Declarado el futuro de PHP4

Monday, April 28th, 2008

Para los que pensaban que Zend se iba a echar para atrás; pues no; no solamente fue removido el soporte para PHP4 desde el 1 de enero de este año; Zend ha declarado el “end of life” (Fin de vida) de PHP4 e indica que PHP 4.4.8 (el actual release) será el último a ser lanzado por Zend de esta versión de PHP.

Adicionalmente ha declarado que antes del 8 de agosto del presente año (8/8/2008) será removido complemente los fuentes de PHP 4 del servidor de php.net y sus respectivos mirrors.

Así que señores, a migrar sus aplicaciones! …

Viva Go PHP5!

Go PHP5!

¿Podemos tener PHP5 corriendo en un apache2 worker?

Saturday, April 12th, 2008

La respuesta básica a esta pregunta es sí; la razón de por qué no es tan simple, pero trataré de explicarlo en el siguiente artículo.

Apache 2 con mod_php puede ser ejecutado en dos modos; mpm_prefork y mpm_worker; mpm_prefork es una especie de compatibilidad con apache 1.x y es bueno para aplicaciones que poseen módulos que no son thread-safe; mpm_worker es un sistema multi-proceso multi-threaded (multi-hilado) y requiere que las aplicaciones en él ejecutadas posean hilos seguros de ejecución (thread-safe); mpm_worker es muchisimo más estable y puede ofrecer más conexiones con menos consumo de recursos; además de ser el ideal para equipos multi-core o multi-procesador.

mpm_worker tiene un rendimiento notablemente superior a mpm_prefork en la gran mayoría de las condiciones generales de un servidor web: ver aquí.

Entonces; ¿Por qué se usa mpm_prefork para PHP5? …

Muchas extensiones php5 (y php4) no son thread-safe; esto hace que php5 sea imposible de usar en modo mpm_worker sin “castrarlo” retirando aquellas extensiones que no lo son; sin embargo, esto no es problema alguno, puesto que la gran mayoría de las extensiones no “thread-safe” son básicamente no usadas por la mayoría; un ejemplo es la extensión mm; que permite crear una caché compartida para gestionar las sesiones (y que puede seguramente ser reemplazada por memcached) casi nunca es usada; gd versión 1 debe ser evitada y usar gd2.

Otro mito extendido por esto es que php5 no puede ser ejecutado en modo worker; esto es porque en Debian solo están los binarios compilados en modo prefork y de hecho, instalar php5 desinstala apache2 mpm_worker e instala mpm_prefork; por lo que he decidido compilar mi propio php5 para Debian Lenny (apache 2.2.4 y php 5.2.5) con soporte mpm_worker.

Compilando php5

Primero, debemos instalar algunas librerías que son requeridas (devel) para compilar php5:

>aptitude install libmhash-dev libmhash2 libtidy-dev libgd2-xpm-dev libgd2-xpm libmcrypt-dev libmcrypt4 mcrypt t1lib-bin libt1-dev libxml2-dev libcurl3-dev libaspell-dev libpspell-dev libxslt-dev libbz2-dev libsqlite-dev libdb4.4 db4.4-util libdb4.4++-dev libsqlite3-dev libsnmp-dev

Y luego de descomprimir php-5.2.5.tar.bz2 (descargado de la página de php.net) ejecutamos el siguiente ./configure en la raíz del código fuente:

CFLAGS=”-O3″ CXXFLAGS=”-O3 -fPIC -mtune=nocona -march=nocona \
-fPIC -pipe -fomit-frame-pointer -msse -fexceptions -ffast-math -mfpmath=sse,387″ \
./configure \
–prefix=/usr/php –sysconfdir=/etc/php5/apache2 –mandir=/usr/share/man \
–with-apxs2=/usr/sbin/apxs –libexecdir=/usr/lib/php5 –bindir=/usr/bin –libdir=/usr/lib/php5 \
–with-config-file-path=/etc/php5 –with-config-file-scan-dir=/etc/php5/conf.d \
–with-exec-dir=/usr/lib/php5/libexec –enable-inline-optimization \
–disable-debug –with-curl –with-curlwrappers –with-db4 \
–with-zlib=/usr –enable-bcmath –enable-calendar –enable-mbstring –enable-dba \
–with-libxml-dir=/usr –with-xmlrpc=shared –with-pear=/usr/share/php –with-regex \
–with-pcre-regex=/usr –enable-exif –with-t1lib –with-xsl \
–with-mhash –with-mcrypt –enable-zend-multibyte –with-pspell –enable-zip –enable-bcmath \
–with-jpeg-dir=/usr –enable-soap –enable-sockets –with-xpm-dir=/usr –with-freetype-dir=/usr/lib \
–enable-ftp –with-gd –with-png-dir=/usr –with-ttf \
–enable-json –with-mime-magic –with-tidy=/usr –with-ldap –with-xmlrpc \
–enable-gd-native-ttf –enable-gd-jis-conv –with-gettext –with-xmlrpc –with-xsl \
–with-mysql –with-mysqli \
–enable-sysvmsg –enable-sysvsem –enable-sysvshm –enable-sigchild \
–with-ldap –enable-mbstring –with-bz2 –with-iconv –with-gettext –enable-shmop \
–enable-sockets –enable-wddx –with-zlib \
–with-kerberos=/usr –with-openssl=/usr –enable-soap –with-snmp=/usr \
–with-pgsql –with-sqlite=/usr \
–enable-pdo –without-pdo-dblib –with-pdo-mysql \
–with-pdo-pgsql –with-pdo-sqlite=/usr

ejecutar:

make all

y luego:

make test

permitirá compilar y luego probar nuestro php5 en modo mpm_worker; al final un:

make install

permitirá instalar php5.2.5

Explicando brevemente las sentencias de pre-procesador:

Como verán, antes del .configure hemos ejecutado unas sentencias que mejoran el rendimiento del ejecutable php; entre ellas compilarla para el procesador que actualmente tenemos; en mi caso -mtune=nocona -march=nocona; nocona indica un procesador de doble nucleo (Core2-Duo), existen distintos modos dependiendo del ejecutable; pentium4, pentium-m, athlon-xp, prescott; siempre es bueno leer sobre -mtune y -march en el wiki de gentoo y en la guía de Compilación optimizada de Gentoo.

Apache Benchmark en un php5 con mpm_worker:

Para la ejecución de una aplicación PHP ab reporta:

ab -c 500 -n 500 http://localhost/tomates/

Requests per second: 32.66 [#/sec] (mean)

Conclusiones:

Espero que la utilización correcta de las extensiones de php; la utilización de un php thread-safe en un apache2 mpm_worker permitan a los desarrolladores crear aplicaciones más óptimas y a los servidores proveer una versión más rápida de php5 ejecutado sobre apache.

Notas finales:

La sentencia de compilación está configurada para el enviroment de debian o fedora (/etc/php5 como ruta del archivo php.ini); recuerden revisar bien el –prefix, –libdir, –bindir y otras rutas dependiendo de la distro donde deseen compilar el php5 en modo worker.