Fa uns dies va contactar amb mi un antic company de feina demanant-me ajuda per tal d’instal·lar sobre un mateix servidor amb Apache 2.2 l’interpret PHP 5 contra MySQL 5 i PHP 4 contra MySQL 4.
Estat del servidor:
- Apache 2.2 + PHP 5 + MySQL 5 instal·lats i funcionant correctament
- S.O.: CentOS 5
Requeriments:
- Fer funcionar les aplicacions antigues en PHP 4 contra MySQL 4 en el mateix servidor.
- No és viable fer canvis en els codis de les aplicacions per migrar-les a les versions 5, ni canviar les extensions, per motius de temps i de complexitat.
Solució d’emergència (Per si tot falla sempre va bé tenir un as a la màniga):
- Instal·lar les versions 4 en un altre servidor Apache 2.2 compilat per nosaltres i arrencat en un port diferent al 80, i utilitzar el mod_proxy al primer Apache per redirigir les peticions als VirtualHosts o contextos de les aplicacions en PHP 4 cap a l’altre Apache que no és directament accessible des de l’exterior.
Solució aplicada:
Finalment s’aconsegueix tenir en un mateix Apache 2.2 les dues versions de PHP corrent com a mòduls i sense interferir entre elles de la següent manera:
MySQL 4:
- Descarreguem el codi font de MySQL 4.1.22 de la web de MySQL (a baix de tot).
- Descomprimim, entrem al directori i el configurem de la següent manera, posant atenció en els PATH’s i en el port:
CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro -felide-constructors -fno-exceptions -fno-rtti" ./configure --with-unix-socket-path=/usr/local/mysql4/tmp/mysql.sock --enable-assembler --with-mysqld-ldflags=-all-static --with-client-ldflags=-all-static --enable-thread-safe-client --with-mysqld-user=mysql4 --prefix=/usr/local/mysql4 --bindir=/usr/local/mysql4/bin --sbindir=/usr/local/mysql4/sbim --libexecdir=/usr/local/mysql4/libexec --datadir=/usr/local/mysql4/share --sysconfdir=/usr/local/mysql4/etc --sharedstatedir=/usr/local/mysql4/com --localstatedir=/usr/local/mysql4/var --libdir=/usr/local/mysql4/lib --includedir=/usr/local/mysql4/include --infodir=/usr/local/mysql4/info --mandir=/usr/local/mysql4/man --with-tcp-port=3304
- Compilem i instal·lem:
make && make install
- Veure la documentació pels detalls de configuració post-instal·lació, i copiar l’script d’inici, el qual haurem de modificar una mica per tal de reflectir l’usuari, el port i els paths correctament.
- Si tot ha anat correctament i teniu el MySQL 4 arrencat, hi podreu accedir de la següent manera:
/usr/local/mysql4/bin/mysql -u root -P3304 -S/usr/local/mysql4/tmp/mysql.sock -p
PHP 4:
- Ara comença lo divertit, i aquest és un dels motius pels quals adoro l’Open Source 😉
- Descarreguem les fonts de PHP 4.4.8 de la web de PHP.
- Abans de configurar i compilar cal modificar tots els fitxers de codi font que continguin l’String application/x-httpd-php i canviar-lo per l’String application/x-httpd-php4 (també els application/x-httpd-php-source per application/x-httpd-php4-source si voleu).
Per buscar els fitxers podem fer-ho de la següent manera:egrep -R "application" /path/fonts-descomprimides/php4/*
- Compilem amb les següents opcions. De nou cal tenir en compte els PATH’s, fixar-nos en el PATH on previament hem instal·lat el MySQL 4 i el PATH al binari apxs de l’Apache 2.2:
./configure --prefix=/usr/local/php4 --enable-module=so --with-calendar=shared --enable-magic-quotes --enable-wddx --enable-ftp --enable-sockets --enable-inline-optimization --enable-memory-limit --with-gd --with-zlib --enable-gd-native-tt --with-ttf --with-gettext --with-freetype-dir=/usr/lib/ --with-jpeg-dir=shared,/usr --with-png-dir=shared,/usr --with-zlib-dir=shared,/usr --with-mysql=/usr/local/mysql4 --with-apxs2=/usr/sbin/apxs
- Compilem i instal·lem:
make && make install
Configuració de l’Apache 2.2:
- Editem el fitxer
/etc/httpd/conf/httpd.conf
i comentem o eliminem la línia que ens ha creat el make install:#LoadModule php4_module /usr/lib64/httpd/modules/libphp4.so
- Creem el fitxer /etc/httpd/conf.d/php4.conf amb el següent contingut
:
#
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#
LoadModule php4_module modules/libphp4.so
AddType application/x-httpd-php4 .php4
#
# Add index.php to the list of files that will be served as directory
# indexes.
# (Opcional en en nostre cas)
DirectoryIndex index.php4#
# Uncomment the following line to allow PHP to pretty-print .phps
# files as PHP source code:
#
#AddType application/x-httpd-php4-source .phps4 - Abans de continuar s’han creat dues bases de dades, una a cada MySQL amb nom test4 i test4, i dos contextos, /test4 i /test5 respectivament amb un únic fitxer index.php amb el següent contingut, per tal de poder testejar la instal·lació:
<?php
function Conectar()
{
if (!($link=mysql_connect("localhost","test4","test4")))
{
echo "Error conectant a la base de dades mysql 4.";
exit();
}
if (!mysql_select_db("test4",$link))
{
echo "Error seleccionant la base de dades test4.";
exit();
}
return $link;
}$link=Conectar();
echo "Conexió amb la base de dades test4 en mysql 4 aconseguida !!!<br>";mysql_close($link);
?><?php
phpinfo();
?>
(El mateix pel 5 canviant 4 per 5) - Directives de configuració de l’Apache necessàries. En aquest cas configurem contextos, però el mateix és aplicable als VirtualHosts. De manera que per cada context o VirtualHost que contingui una aplicació en PHP ens cal fer el següent:
- PHP5:
<Directory /web/test5>
AddHandler application/x-httpd-php .php
</Directory> - PHP 4:
<Directory /web/test4>
RewriteRule ^/$ /index.php [T=application/x-httpd-php4]
AddHandler application/x-httpd-php4 .php
</Directory>
- PHP5:
Res més per avui, espero que hàgiu gaudit de l’experiència, igual que ho vaig fer jo, i que si mai en teniu la necessitat no us trenqueu massa la closca provant coses inútils. Aquesta configuració funciona perfectament i ja porta un temps en producció sense donar cap mena problema.