¿Podemos tener PHP5 corriendo en un apache2 worker?

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.

Acerca de phenobarbital

http://about.me/phenobarbital

Publicado el 12 abril 2008 en Cultura Libre, Linux, PHP, PlanetaLinux y etiquetado en , , , , , , , . Guarda el enlace permanente. Deja un comentario.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: