Informàtica

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.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>

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.