A la hora de ejecutar PHP de forma eficiente, nos toca aprender un par de cosas sobre cachés, desactivar logs, etc. de igual forma que Apache. En este artículo describo directamente como cambiar algunas cuestiones de configuración, instalar XCaché, Zend Optimizer y Suhosin para que se ejecuten con PHP. Recomiendo tomarse un tiempo con cada tema para investigarlo bien y comprenderlo.
La configuración
En un servidor en producción, convienen los siguientes cambios en la configuración de php.ini:
Nos aseguramos que no desvelamos la versión de PHP:
expose_php = Off
Aumentar el límite de memoria si sabemos que algún script puede necesitarla:
memory_limit = 64M
Nos aseguramos de no mostrar ningún tipo de error si algo falla (para evitar desvelar paths y otra información que pudiera ser sensible)
display_errors = Off
Y si queremos ganar algo de velocidad, no es mala idea desactivar el logging de errores también. Se supone que el servidor en producción no es para debugging:
log_errors = Off
Instalando Zend Optimizer
Los beneficios del gratuito Zend Optimizer son básicamente que permite ejecutar archivos codificados con Zend Encoder y en algunos casos puede ganarse hasta un 40% de velocidad al ejecutar código PHP. Aunque existe controversia en cuanto a esto, siendo un paquete oficial de Zend (los autores de PHP), resulta por lógica mucho más confiable que cualquier otro paquete de terceros que podamos utilizar.
# wget http://downloads.zend.com/optimizer/3.3.3/ZendOptimizer-3.3.3-linux-glibc23-i386.tar.gz # tar xvzf ZendOptimizer* # cd ZendOpt* # ./install.sh
El proceso terminará por añadir al archivo php.ini un bloque encabezado con [Zend]
# php -v
Debería retornar ahora algo como
PHP x.x.x Copyright (c) 1997-2006 The PHP Group Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies with Zend Extension Manager v1.2.2, Copyright (c) 2003-2007, by Zend Technologies with Zend Optimizer v3.3.3, Copyright (c) 1998-2007, by Zend Technologies
La configuración de SUHOSIN y XCACHE, cuya instalación veremos ahora, debería ir ENCIMA del bloque [Zend]. De lo contrario al arrancar PHP se quejará con un error como este:
PHP Fatal error: [Zend Optimizer] Zend Optimizer 3.3.3 is incompatible with XCache 1.2.2 in Unknown on line 0
Instalando SUHOSIN
SUHOSIN añade una capa de seguridad a PHP. Sin profundizar, diríamos que es lo mismo que la detección heurística de los antivirus, ya que no protege realmente contra problemas conocidos, sino que protege puntos débiles del mismo núcleo de PHP. Es un proyecto de un ex-programador de seguridad de PHP.
# wget http://download.suhosin.org/suhosin-0.9.27.tgz # tar xvzf suhosin* # cd suhosin* # phpize # ./configure # make # make install
Asegurarse que el archivo generado “suhosin.so” está en el directorio de módulos de php necesario (puede ser /usr/lib/php/modules o bien otro)
Añadir, ENCIMA del bloque de [Zend] en php.ini:
extension = suhosin.so
Instalando XCACHE
XCache se autodescribe como un cacheador de opcode PHP que es rápido, estable, muy probado y que se usa en servidores en producción con muchas visitas. El aumento del rendimiento se nota: sólo tenemos que pensar que en lugar de interpretarse los scripts PHP cada vez y ejecutar el código, directamente se ejecuta el código ya interpretado que está en caché.
Aunque personalmente vengo utilizando ‘PHP opcode cachers’ como EAccelerator y Turck MMCACHE desde hace tiempo, este XCache ha funcionado bien y ha resultado dar menos problemas con los cambios de versión de PHP.
# yum install php-devel # wget http://xcache.lighttpd.net/pub/Releases/1.2.2/xcache-1.2.2.tar.gz # tar -zxf xcache-*.tar.gz # cd xcache-* # phpize # ./configure --enable-xcache # make # make install
Asegurarse que el archivo generado “xcache.so” está en el directorio de módulos de php necesario (puede ser /usr/lib/php/modules o bien otro)
Añadir la siguiente configuración al php.ini (si lo metemos como archivo INI en /etc/php.d/ no podremos controlar el orden de cargado y no funcionará)
Nota: Primero debe ir la config. de Suhosin, luego XCACHE y finalmente el bloque del Zend Optimizer.
[xcache-common] zend_extension = /usr/lib/php/modules/xcache.so
[xcache.admin] xcache.admin.user = "admin" xcache.admin.pass = "md5password"
[xcache] xcache.shm_scheme = "mmap" xcache.size = 64M xcache.count = 1 xcache.slots = 8K xcache.ttl = 0 xcache.gc_interval = 0 xcache.var_size = 0M xcache.var_count = 1 xcache.var_slots = 8K xcache.var_ttl = 0 xcache.var_maxttl = 0 xcache.var_gc_interval = 3000 xcache.test = Off xcache.readonly_protection = Off xcache.mmap_path = "/dev/zero" xcache.coredump_directory = "/tmp/xcache" xcache.cacher = On xcache.stat = On xcache.optimizer = Off
[xcache.coverager] xcache.coverager = Off xcache.coveragedump_directory = ""
Al final, deberíamos terminar con una salida de “php -v” parecida a esta y sin errores:
# php -v
PHP x.x.x Copyright (c) 1997-2006 The PHP Group Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies with XCache v1.2.2, Copyright (c) 2005-2007, by mOo with Zend Extension Manager v1.2.2, Copyright (c) 2003-2007, by Zend Technologies with Suhosin v0.9.27, Copyright (c) 2007, by SektionEins GmbH with Zend Optimizer v3.3.3, Copyright (c) 1998-2007, by Zend Technologies