La receta de PHP4

TÍTULO:		La receta de PHP4
VERSIÓN LFS:	2.4
AUTOR:		J. Jones <jdj@darkside.dynup.net>
TRADUCTOR:	Proyecto LFS-ES

SINOPSIS:
Esta receta debería lograr tener apache y PHP listos y funcionando, con la mayoría 
de las características de PHP habilitadas. Los métudos aquí usados parecen ser 
(para mí) el balance perfecto entre rendimiento y el uso eficiente de recursos. PHP 
será compilado estáticamente dentro de apache, lo cual da el mejor rendimiento, la 
mayoría de los extras de PHP serán construidos como módulos compartidos, 
dejando así el binario httpd bonito y pequeño (léase sexy).

RECETA:
	Versión:        1.0-test1

Tengo que asumir muchas de las opciones de configuración en esta receta,
así que si eres de los que se pone a jorungar (principalmente los --prefix's)
¡pon atención! :)

=====================================
Programas usados/mencionados/etc en esta receta.

Apache
  http://httpd.apache.org/dist/

PHP
  http://php.net/downloads.php

MySQL
  Al parecer el servidor SQL libre más popular
  http://www.mysql.com/downloads/

PostGreSQL
  Excelente servidor SQL libre
  http://postgresql.readysetnet.com/sites.html

Berkeley DB3
  Patea al SQL, ¡úsalo!
  http://www.sleepycat.com/download.html

GD - 1.8.4 en este momento es la versión recomendada.
  Creación de imágenes al vuelo
  http://www.boutell.com/gd/

    zlib
      Librería de compresión
      ftp://ftp.freesoftware.com/pub/infozip/zlib/

    libjpeg
      Librería Jpeg
      ftp://ftp.uu.net/graphics/jpeg/

    libpng
      Librería PNG
      ftp://ftp.libpng.org/pub/png/src/

    libungif
      Librería GIF libre de patentes
      ftp://prtr-13.ucsc.edu/pub/libungif/

    libttf/libfreetype
      Librería de fuentes de tipo verdadero (o TrueType, ¡QUERRÁS ESTO!)
      http://freetype.sourceforge.net/

OpenSSL
  Maravillosa librería de encriptación
  http://www.openssl.org/

mhash
  Provee acceso a gran cantidad de algoritmos de arreglos asociativos (hashing)
  http://mhash.sourceforge.net/dl

(lib)mcrypt
  Provee acceso a gran cantidad de esquemas de encriptación
  http://mcrypt.hellug.gr/

readline
  GNU readline (Esto es lo que hace a bash tan fresco)
  ftp://ftp.gnu.org/gnu/readline/

pspell
  La nueva API de aspell/ispell
  http://pspell.sourceforge.net/

Imap - 2000c por favor, no la última beta que ellos quisieran que tu tuvieras :)
  la librería imap de WU
  ftp://ftp.cac.washington.edu/imap/old/imap-2000c.tar.Z

Curl
  Librería de Cliente URL
  http://curl.haxx.se/download.html

libxml
  Librería de XML DOM, no debe ser confundida con la expat de apache,
  usada por el analizador sintáctico para xml de php.
  http://www.xmlsoft.org/#Downloads

LDAP
  Servidor y librería LDAP
  http://www.openldap.org/software/download/

zziplib
  La zlib de archivos zip
  http://zziplib.sourceforge.net/

=====================================
Dónde comenzar...

----------------

APACHE

Extrae los fuentes de apache. Mueve este directorio a
/usr/local/apache (mv ./apache_1.3.17 /usr/local/apache).
Accede a /usr/local/apache.

Edita el fichero config.layout para satisfacer tus gustos. Luego, ejecuta

		./configure \
		--with-perl=/usr/bin/perl \
		--enable-module=all \
		--enable-shared=max \
		--disable-module=proxy \
		--disable-module=usertrack \
		--disable-module=auth_anon \
		--disable-module=auth_db \
		--disable-module=auth_dbm

Esto hará que apache construya todos sus módulos como DSO's (u Objetos
Dinámicos Compartidos, por sus siglas en inglés), reduciendo así el tamaño
del binario httpd.  Así es como yo lo hago, siéntete libre de jorungar tanto
como quieras.  No afectará nada más. El permitir a algunos de estos módulos
ser compilados estáticamente podría incrementar el rendimiento, pero eso
es para otra receta. ;) ¡SIÉNTETE LIBRE PARA MEJORAR ESTA RECETA!

Volveremos con apache más tarde.

----------------

GD
	
Todas las librerías de las que depende este paquete son sencillas de instalar.
No ahondaremos en ellas. Asumiré un prefijo --prefix=/usr en los tres primeros
(jpeg, ungif y png) y un prefijo --prefix=/usr/X11R6 en los dos últimos
(ttf/freetype, t1). Compila estas librerías en el orden que han sido listadas,
especialmente las dos últimas.

Extrae los fuentes de gd-1.8.4.  Descarga el parche (construirá un .so para
tí :) de ^^^^GD-URL^^^^.  Aplicar este parche debe ser tan simple como:
	zcat gd-1.8.4-shared.patch.gz | patch -p0
Edita el Makefile hasta que veas que se ajusta a tus necesidades (prefijos de
instalación, posible remoción de las banderas de freetype, lo cual no recomiendo
en absoluto).  El Makefile leerá la variable de entorno $CFLAGS, así que no te
preocupes por ésta.

	make all install

----------------

Imap

Las librerías c-lient de imap son muy beta.  Recomiendo quedarse con la
última liberación (release) estable, 2000c.  De todas maneras, mi parche no 
funciona en nada más sin algo de hackeo. ;)

Extrae el paquete imap-2000c, descarga el parche (que también creará un .so
para tí :) de ^^^^IMAP-URL^^^^. Aplícalo con:
	zcat imap-2000c-shared.patch.gz | patch -p0
Accede al directorio imap-2000c, y ejecuta los siguientes comandos:
	chmod a+x Build-me
	./Build-me

Esto debería ser todo lo necesario.  Este árbol de fuentes en mi opinión es algo
sucio, así que si la construcción te falla, pégame una grito. Envíame por correo
el fichero WU-imap.sucks (WU-imap.apesta) que se crea así:
	make clean
	./Build-me >WU-imap.sucks 2>&1
y veré qué puedo hacer.

----------------

PHP

Básicamente lo que yo hago es quitarle todo al intérprete php, dejando lo
mínimo necesario, lo compilo estáticamente en apache, luego construyo los
extras de php como objetos compartidos que pueden ser cargados por guiones
(o al inicio en el php.ini).

El módulo estático para apache de PHP:
Extrae los fuentes de php.  Entra en el directorio.  Escribe lo siguiente,
nota que también debes cambiar las rutaaaaaas:

	./configure \
	--prefix=/ruta/al/apache \
	--with-config-file-path=/ruta/a/los/ficheros/de/conf/de/apache \
	--with-apache=/ruta/al/apache \
	--disable-pear \
	--without-mysql \
	--disable-xml \
	--without-pcre-regex \
	--disable-posix \
	--with-openssl=/ruta/al/openssl \
	--enable-trans-sid
	make all install

Desafortunadamente el openssl no te permitirá (o no es capaz de) ser construido
como un objeto compartido, así que si lo quieres tendrás que agregarlo ahora.
Ya he intentado hackearlo exitosamente para construirlo como un .so; si alguien
lo ha logrado, ¡déjenmelo saber! :) (Incluso la versión CVS actual no lo permite).

Ahora, volvamos al apache.  Ejecuta los mismos comandos de configuración
que usaste anteriormene para el mismo apache, agregándole la siguiente 
línea:

	--activate-module=src/modules/php4/libphp4.a

Puedes ahora ejecutar make all install en apache.
You can now make all install on apache.


Intérprete CGI de PHP.

Esto es completamente opcional, pero es algo agradable de tener, en mi opinión.
Esto creará un intñerprete binario de php, el cual podrás usar justo como
perl o sh. NO lo uses para páginas web.

en el directorio de fuentes de php, haz lo siguiente:

	make distclean
	./configure \
	--prefix=/usr/local \
	--with-config-file-path=/usr/local/etc \
	--enable-force-cgi-redirect \
	--enable-discard-path \
	--disable-pear \
	--without-mysql \
	--disable-session \
	--without-pcre-regex \
	--disable-posix \
	--disable-xml \
	--with-openssl=/ruta/al/openssl
	make all install

Ahora tendrás un intérprete de la línea de comandos en /usr/local/bin/php.


Extras de PHP:

Ahora, la parte divertida.  Haz un make distclean en el árbol de fuentes de php.

NOTAS:  PHP viene con una versión integrada de la líbrería cliente de mysql, así
	que no requiere un mysql instalado para soportarlo.  Si estás usando pspell,
	necesitas el parche de ^^^^PSPELL-PATCH^^^^ para que php compile exitosamente.
	Esta librería fué actualizada recientemente, y cambió un poco su api. El
	parche arreglará el soporte a pspell de php.  DOM XML (libxml) requiere tanto
	a libxml-1.* como a libxml2-* para ser instalado.

./configure options  
	--with-apache=/usr/local/apache == Ruta al árbol de
		fuentes de apache, contruye como módulos de apache

Cuestiones de las bases de datos... 
	Para soportar MySQL...
	--with-mysql=shared,/opcional/ruta/al/mysql (lee la nota de arriba)
			 ==  Incluye el cliente para mysql.
	Para soportar PostGreSQL...
	--with-pgsql=shared,/prefijo/de/instalación/de/pgsql ==  Incluye el 
		cliente para pg, prefijo de la instalación de postgres
	Para soportar DB3(¡TIENES QUE PROBARLO! ¡ESTO SUPERA A LOS *SQL!)
	--enable-dba=shared  == habilita la capa de abstracción de la db
	--with-db3=/usr  == ¡agrega el soporte a db3!
 
Para soportar GD...
	--with-gd=shared,/usr/X11R6  ==  utiliza gd, prefijo de la instalación de gd
	--with-jpeg-dir=/usr   ==  las librerías jpeg están prefijadas aquí
	--with-xpm-dir=/usr/X11R6   ==  las librerías xpm libs están prefijadas aquí
	--with-ttf=/usr/X11R6   ==  utiliza ttf, y está prefijada aquí
	--with-t1lib=/usr/X11R6  ==  Usa las fuentes tipo 1 (type 1),
	    y el prefijo está aquí
	--enable-gd-imgstrttf
	--enable-gd-native-ttf

Cuestiones de encriptación y compresión...
	Para mhash...
		--with-mhash=shared,/usr  ==  utiliza mhash, está prefijada aquí
	Para mcrypt...
		--with-mcrypt=shared,/usr  ==  utiliza mcrypt, está prefijada aquí
	Para zlib...
		--with-zlib=shared,/usr  ==  utiliza las funciones de zlib, y está prefijada aquí
	Para bzip2...
		--with-bz2=shared,/usr  == bzip2!
	Para zziplib
		--with-zziplib=shared,/usr == zzip!

Soporte imap...
	--with-imap=shared,/prefijo/al/imap/  == habilita las funciones imap
	--with-imap-ssl=/ruta/al/openssl  == ¡agrega soporte ssl!

Misceláneos...
	--with-pcre-regex=shared  == ¡Expresiones Regulares Compatibles con Perl! (incorporado)
	--with-pspell=shared,/ruta/al/pspell  == Soporte a pspell 
	--with-curl=shared,/ruta/al/curl  == ¡utiliza curl!
	--with-ldap=shared,/ruta/al/openldap  == habilita las funciones ldap
	--with-gettext=shared,/usr == ¡Soporte a GNU gettext!
	--with-readline=shared,/usr == ¡Soporte a GNU Readline!
	--enable-bcmath=shared  == cálculos de precisión bcmath (incorporado)
	--with-gmp=shared		== librería de presición matemática de GNU (incorporado)
	--enable-posix=shared  == funciones posix (incorporado)
	--enable-calendar=shared == conversión de calendarios (incorporado)
	--enable-ctype=shared == funciones de tipos de caracteres (incorporado)
	--enable-filepro=shared  == soporte integrado a filepro (incorporado)
	--enable-shmop=shared  == soporte a shmop (incorporado)
	--enable-sysvsem=shared  == funciones de semáforo SystemV (incorporado)
	--enable-sysvshm=shared == funciones de compartición de memoria SystemV (incorporado)
	--with-xml=shared  == soporte al análisis sintáctico de XML (incorporado)
	--enable-wddx=shared  == material de XML wddx (incorporado)
	--with-domxml=shared,/ruta/al/libxml  == material DOM XML 
	--enable-ftp=shared  ==  habilita las funciones ftp (incorporado)
	--enable-sockets=shared   ==  habilita las funciones de conexiones (sockets) de redes 
	    (incorporado)
	--enable-yp=shared  == soporte a yp (incorporado)
	--enable-dbase=shared  == soporte de sólo lectura para dbase (incorporado)
	--enable-exif=shared  == soporte a exif (incorporado)

La opción =shared (compratido) crea una librería compartida que cargará php,
permitiéndote actualizar uno o más módulos/características, sin necesidad de
recompilar apache y php.

Aquí está el comando ./configure, con todas las opciones mostradas anteriormente.
Asegúrate de arreglar las rutas. ;)

	./configure \
	--with-apache=/usr/local/apache \
	--with-mysql=shared,/opcional/ruta/al/mysql \
	--with-pgsql=shared,/prefijo/de/instalación/de/pgsql \
	--enable-dba=shared \
	--with-db3=/usr \
	--with-gd=shared,/usr/X11R6 \
	--with-jpeg-dir=/usr \
	--with-xpm-dir=/usr/X11R6 \
	--with-ttf=/usr/X11R6 \
	--with-t1lib=/usr/X11R6 \
	--enable-gd-imgstrttf \
	--enable-gd-native-ttf \
	--with-mhash=shared,/usr \
	--with-mcrypt=shared,/usr \
	--with-zlib=shared,/usr \
	--with-bz2=shared,/usr \
	--with-zziplib=shared,/usr \
	--with-imap=shared,/prefijo/al/imap/ \
	--with-imap-ssl=/ruta/al/openssl \
	--with-pcre-regex=shared \
	--with-pspell=shared,/ruta/al/pspell \
	--with-curl=shared,/ruta/al/curl \
	--with-ldap=shared,/ruta/al/openldap \
	--with-gettext=shared,/usr \
	--with-readline=shared,/usr \
	--enable-bcmath=shared \
	--with-gmp=shared \
	--enable-posix=shared \
	--enable-calendar=shared \
	--enable-ctype=shared \
	--enable-filepro=shared \
	--enable-shmop=shared \
	--enable-sysvsem=shared \
	--enable-sysvshm=shared \
	--with-xml=shared \
	--enable-wddx=shared \
	--with-domxml=shared,/ruta/al/libxml \
	--enable-ftp=shared \
	--enable-sockets=shared \
	--enable-yp=shared \
	--enable-dbase=shared \
	--enable-exif=shared \
	--disable-nls \
	| tee ~/php-config.log

este guión tiende a ser suficientemente rápido.. así que verifica el ~/php-config.log
para obtener los resultados.

El guión de configuración de PHP no parece manejar sus -L's e -I's muy bien. Si
obtienes cualquier error fatal, verifica el config.log.  Mi arreglo temporal para
esto es añadir lo siguiente al inicio de la línea del ./configure:

	CFLAGS=$CFLAGS\ -L/usr/local/lib\ -L/usr/X11R6/lib\ -I/usr/local/include\
-I/usr/X11R6/include <el comando de configuración anterior>

Tengo la esperanza que esto sea arreglado en un futuro.

Una vez que todo se luzca bien, ejecuta un make.  Una vez completado, escoje
la ubicación en donde mantener los .so's, como /usr/local/lib/php, accede al
directorio de los módulos (modules) y cp *.so /usr/local/lib/php/.  Probablemente
también desees hacer un strip -g a estos módulos.

Ahora, la llave aquí es tu php.ini.  Copia el fichero php.ini-dist del
directorio de fuentes a 
/la/ruta/del/fichero/de/configuración/que/escogiste/cuando/construiste/el/módulo/apache/php.ini.
En este fichero, cambia el extension_dir a la /ruta/donde/copiaste/los/*.so's.

Si deseas que php cargue cualquiera de éstos al inicio, agrega 
extension=nombre.so en el php.ini.  Para cargarlos en tiempo de ejecución, 
esta parece ser la manera más efectiva.

	Digamos que necesito el soporte para mysql. Al inicio de mi guión, debería
	tener esto:
		if(!function_defined('mysql_query')) {dl('mysql.so'); }
	Por favor, date cuenta del ! :)

Tal vez desees hacer un ldd a todos estos .so's.. ellos matarán al httpd hijo
si son llamados con dl() y no consiguen alguna librería que necesiten (sin
embargo, es mejor que matar todo el apache, ¿eh?).

Siéntete libre para enviarme correos (N. del T. En inglés) con preguntas respecto
a este proceso o sobre el uso de los objetos compartidos.  Tambien Agradezco 
cualquier sugerencia para mejorar esta receta.
----------------