Con la desaparición de mod_php en Dreamhost y el uso cada vez mayor de PHP 5 por parte de la gente se me está haciendo hasta normal recibir consultas de cómo compilar PHP con opciones adicionales como eAccelerator o APC.
Hace unos días me hicieron la última consulta y acabe cayendo en una
cosa: si PHP se ejecuta como mod_php
no hay mucho que hacer pero si
lo hace como CGI (o FastCGI) ¿por qué no se debe poder usar tu
propio php.ini?. Total es sólo un proceso más en el ordenador,
independiente del servidor.
Justamente eso andaba buscando cuando encontré una forma sencilla de cargar PHP como CGI (FastCGI) al mismo tiempo que se compila eAccelerator y se pasa a usar tu propio php.ini, ¡y sin compilar PHP! (que es lo que más mata al personal).
Es posible que las versiones no sean las mismas, tened en cuenta que el artículo es de junio del año pasado aunque con versiones más recientes no (me ha) dado problemas.
Un apunte importante mod_php
versus cgi/fastcgi
Como ya se advirtió en el artículo anterior al respecto, si se va al
panel de dreamhost y se activa PHP4/PHP5 en lugar de mod_php
se
pierde la posibilidad de volver a mod_php
el cual es 10 veces más
rápido (consume de media 10 veces menos) que la versión CGI. Además de
que con CGI pueden controlar tu consumo de CPU.
Si a eso le añadimos que pasar de CGI a FastCGI aumenta la velocidad entre 6 y 9 veces pero no siempre funciona en todos los servidores de DH lo mejor que podemos hacer es tener en cuenta este artículo sólo para sitios que:
- Requieran PHP 5 y/o eAccelerator (
mod_php
sólo está para PHP 4). - Nuevos dominios que no puedan optar a usar
mod_php
. - Hayan perdido la posibilidad de usar
mod_php
.
Compilando e instalando dependencias
Lo primero es instalar autoconf
y automake
ya que son
necesarios para compilar eAccelerator, también son necesarios
libtool
y m4
pero estos ya los usa Dreamhost.
mkdir $HOME/gnu wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.61.tar.gz tar -xvzf autoconf-2.61.tar.gz cd autoconf-2.61 ./configure –prefix=$HOME/gnu make make install export PATH=$PATH:$HOME/gnu wget http://ftp.gnu.org/gnu/automake/automake-1.9.tar.gz tar -xvzf automake-1.9.tar.gz ./configure –prefix=$HOME/gnu make make install
Con esto ya tendremos instalados automake y autoconf en $HOME/gnu, además de que el export permitirá compilar eAccelerator encontrando las dependencias en los sitios habituales + $HOME/gnu.
Compilando e instalando eAccelerator
wget http://bart.eaccelerator.net/source/0.9.5.1/eaccelerator-0.9.5.1.tar.bz2 tar -xjf eaccelerator-0.9.5.1.tar.bz2 cd eaccelerator-0.9.5 export PHP_PREFIX=/usr/local/php5/bin $PHP_PREFIX/phpize ./configure –prefix=$HOME/gnu –enable-eaccelerator-shared –with-php-config=$PHP_PREFIX/php-config make mkdir $HOME/phpini mkdir $HOME/phpini/lib cp modules/eaccelerator.so $HOME/phpini/lib
Nota: he corregido el último "cp" ya que guardaba el eaccelerator.so en phpini en lugar de phpini/lib y luego en el php.ini lo referenciaba a phpini/lib por lo que es un error.
Con esto ya tenemos eAccelerator compilado y guardado en $HOME/phpini/lib, ahora copiamos el php.ini:
cp /etc/php5/cgi/php.ini $HOME/phpini/php.ini
Modificando php.ini para el eAccelerator
Abrimos el php.ini y lo primero que modificaremos es el campo
extension_dir
para apuntar a /home/TU-USUARIO/phpini/lib.
Si no sabes que usuario tienes (antes podíamos usar la variable $HOME pero ahora no es recomendable) podemos verla con un echo $HOME.
Luego en el php.ini añadimos debajo de la sección "dynamic extensions" lo siguiente:
extension="eaccelerator.so" eaccelerator.shm_size="16" eaccelerator.cache_dir="/home/TU-USUARIO/tmp/eaccelerator" eaccelerator.enable="1" eaccelerator.optimizer="1" eaccelerator.check_mtime="1" eaccelerator.debug="0" eaccelerator.filter="" eaccelerator.shm_max="0" eaccelerator.shm_ttl="0" eaccelerator.shm_prune_period="0" eaccelerator.shm_only="0" eaccelerator.compress="0" eaccelerator.compress_level="9"
Apunte sobre compress_level=9
+ compress = 0, no es completamente
necesario ya que desactivamos la compresión pero es necesario si
queremos hacer compresión de cache.
También hay que crear el directorio $HOME/tmp/eaccelerator
donde se
guardan los temporales:
mkdir -p $HOME/tmp/eaccelerator
¿Y por qué no usar eAccelerator con PHP CGI normal?
- Es un suicidio en CPU.
- eAccelerator no hace cache alguna si no es FastCGI.
Por último, activamos FastCGI
El sistema es casi igual a la vez anterior, nos vamos al dominio que
queramos tener con FastCGI (ej: $HOME/tu-dominio) y creamos el
fichero fastcgi.fcgi
(según articulo) o php5-wrapper.fcgi
(según
documentación oficial de DH).
En él tenemos que añadir el siguiente código:
#!/bin/sh export PHPRC=/home/TU-USUARIO/phpini export PHP_FCGI_CHILDREN=3 exec /dh/cgi-system/php5.cgi
Como se puede ver, igualito que el anterior si obviamos el PHPRC que es
la variable para que cargue nuestro php.ini
en lugar del de dreamhost.
Guardamos y modificamos el .htaccess
al principio del todo para que
todas las peticiones PHP vayan al fichero fastcgi.fcgi
:
AddHandler fastcgi-script fcg fcgi fpl AddHandler php5-fastcgi .php Action php5-fastcgi /fastcgi.fcgi Options +ExecCGI
Luego matamos todos los procesos (killall php5.cgi
) para que
empiece a trabajar.
¿Funciona?
Toca crear un fichero phpinfo.php que contenga:
<?php phpinfo() ?>
Y abrirlo para ver si se ha creado una sección de eAccelerator. Si es así y además indica que hay scripts cacheados ya está funcionando.
Resumiendo
El proceso es igual que activar FastCGI sólo que le añadimos un php.ini personalizado, aprovechando esa circunstancia podemos añadir nuevas extensiones que toca compilar.
Ningún misterio pero altamente útil, a partir de ahí se pueden añadir
todas las extensiones que se quieran (siempre que funcionen bajo
FastCGI) compilando y añadiendo luego la información al php.ini
,
solamente hace falta matar los procesos php5.cgi
.
Comentarios