PHP 4 i PHP5 com a mòdul sobre el mateix Apache 2.2 (en linux, clar)
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.confi 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.
| Si t'ha agradat l'article pots convidar-me a una birra |


An impressive share, I just given this onto a colleague who was doing a little analysis on this. And he in fact bought me breakfast because I found it for him.. smile. So let me reword that: Thnx for the treat! But yeah Thnkx for spending the time to discuss this, I feel strongly about it and love reading more on this topic. If possible, as you become expertise, would you mind updating your blog with more details? It is highly helpful for me. Big thumb up for this blog post!