PHP 5.3 : Compilation et Installation sur une vmware

20 octobre 2008compilation, php, php-5.3, source, vmware
 Cet article a été rédigé il y a plusieurs années et peut ne plus être tout à fait à jour…

PHP 5.3 n'était pas encore en version alpha lorsque j'ai commencé à vouloir l'essayer.
Considérant que je ne voulais pas risquer de "casser" l'installation Apache + PHP 5.2 que j'ai sur mon PC et que j'utilise quotidiennement, la solution la plus simple à mettre en place et laissant le plus de liberté en termes d'expérimentations, était d'installer PHP 5.3 au sein d'une machine virtuelle.

C'est ce que nous ferons au cours de cet article : installer PHP 5.3 depuis les sources, sur une machine virtuelle...
Et voici le sommaire de cet article :

J'ai choisi d'utiliser vmware, un des outils de virtualisation les plus connus, qui est gratuit, et disponible à la fois sous Windows et sous Linux : VMware Server
Pour la suite de cet article, je supposerai que vous avez installé vmware -- sous Windows, c'est l'histoire de quelques "suivant", et sous Linux, ce n'est pas bien compliqué non plus (et au besoin, google is your friend).

VMware

Le système que j'installerai sur ma machine virtuelle est un GNU/Linux ; une distribution Ubuntu Server 8.04, plus précisément[1] : c'est plus adapté que Windows quand il s'agit de faire tourner un serveur Apache + PHP, et, surtout, quand il s'agit de compiler PHP !
(Sans compter, avantage non négligeable, la gratuité : je n'ai pas de licence Windows disponible ^^)

Le processus d'installation d'Ubuntu Server est relativement simple : globalement, suivant, suivant, suivant ; en veillant à ne choisir aucun logiciel à installer lorsque l'assistant demande de quel type de serveur nous souhations disposer.
De la sorte, nous obtenons une installation relativement minimaliste, sur laquelle nous pourrons installer exactement ce dont nous avons besoin, sans avoir à côté quantité de logiciels inutiles.

Vous noterez que j'ai créé un utilisateur dont le login est "php". Son mot de passe est aussi "php".

Installation d'un serveur SSH

La première étape, une fois l'installation du système en elle-même terminée, est d'installer un serveur SHH :

apt-get install openssh-server

De la sorte, nous pourrons nous connecter à distance à la machine virtuelle, ce qui est plus commode pour travailler -- notamment en terme d'intégration avec le système que vous utilisez quotidiennement !

Obtenons l'adresse IP de la machine virtuelle :

ifconfig

Et maintenant, nous pouvons travailler à distance, en SSH, sans avoir jamais besoin de revenir directement sur la machine virtuelle :
Depuis votre système hôte, vous pouvez vous connecter à votre machine virtuelle avec l'utilisateur ("php") que vous avez créé lors de l'installation :

ssh -l php 172.16.133.128

Typiquement, j'utilise fréquemment cette possibilité pour éditer mes fichiers via Eclipse PDT, connecté à la machine virtuelle à l'aide du plugin RSE Target Management.

Mise à jour du système

Une fois le système installé, il peut être bon de le mettre à jour, pour disposer de la dernière version disponible (y compris correctifs de sécurité -- OK, sur une machine virtuelle de test, ce n'est probablement pas indispensable... Mais c'est toujours un bon réflexe) :

apt-get update && apt-get dist-upgrade

Installation des logiciels dont nous aurons besoin

Nous voulons obtenir une installation comportant Apache et PHP 5.3, que nous compilerons depuis les sources.
Cela signifie qu'il va nous falloir installer quelques paquets supplémentaires :

apt-get install apache2-mpm-prefork zip unzip make sun-java5-jdk subversion ant apache2 subversion-tools perl memcached build-essential gcc-4.1-locales automake1.9 autoconf manpages-dev debian-keyring apache2-prefork-dev libxml2-dev libcurl4-gnutls-dev libicu-dev libmcrypt-dev libpng12-dev libxslt1-dev

Quelques précisions sur certains paquets :

  • apache2-mpm-prefork : Serveur Apache2, avec le module prefork + le paquet de développement correspondant
  • build-essential : Une bonne partie des outils permettant de compiler un logiciel sont regroupées par Ubuntu via ce paquet
  • libxml2-dev et libxslt1-dev : nous voulons activer les fonctionnalités de manipulation XML de PHP ; nous avons donc besoin de ces paquets lors de la compilation
  • libicu-dev : Pour ce qui est gestion de l'internationalisation
  • libpng12-dev : Pour intégration de GD à PHP


Téléchargement des sources de PHP 5.3

Comme dit plus haut, nous allons compiler PHP 5.3 depuis les sources, en nous basant sur la toute dernière version disponible.
(Ce n'est bien évidemment pas la démarche qu'il faudrait suivre pour un environnement de production... Mais pour tester les nouveautés de PHP 5.3, cela permet de disposer d'une installation parfaitement à jour, sans avoir besoin d'attendre la sortie d'une version "officielle" -- que ce soit alpha, beta, RC, ou finale ^^)

Pour commencer, nous travaillerons pour la compilation des sources dans un répertoire temporaire :

mkdir /home/php/temp
cd /home/php/temp

La toute dernière version des sources est disponible via un snapshot re-créé tous les jours, téléchargeable sur snaps.php.net.
Aujourd'hui, vous pouvez télécharger un snapshot de PHP 5.2 (la version stable actuelle), un autre pour PHP 5.3 (la prochaine version en cours de développement), et un dernier pour PHP 6 (la version suivante, elle aussi en cours de développement).
Celui qui nous intéresse est le snapshot de PHP 5.3, qui aura une URL de la forme suivante : http://snaps.php.net/php5.3-200809281430.tar.bz2 (Cette URL changeant à chaque génération d'un nouveau snapshot, elle sera à adapter par vos soins !)

Téléchargez le dernier snapshot, et décompressez-le :

wget http://snaps.php.net/php5.3-200809281430.tar.bz2
tar xvf php5.3-200809281430.tar.bz2
cd php5.3-200809281430

Une fois la décompression des sources terminée, nous allons pouvoir passer au processus de compilation...


Compilation de PHP 5.3

La compilation d'un logiciel depuis ses sources se fait traditionnellement en trois étapes :

  • Configuration
  • Compilation
  • Installation

PHP 5.3 ne déroge pas à la règle.

Configuration de la compilation

La première étape est d'indiquer au processus de compilation quels composants devront être construits.
Pour obtenir la liste des possibilités et des options correspondantes, utilisez :

./configure --help

Vous obtiendrez en sortie la liste de toutes les options de compilation acceptées :

$ ./configure --help
Usage: configure [options] [host]
Options: [defaults in brackets after descriptions]
Configuration:
  --cache-file=FILE       cache test results in FILE
  --help                  print this message
  --no-create             do not create output files
  --quiet, --silent       do not print `checking...' messages
  --version               print the version of autoconf that created configure
Directory and file names:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [/usr/local]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [same as prefix]
  --bindir=DIR            user executables in DIR [EPREFIX/bin]
  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
  --datadir=DIR           read-only architecture-independent data in DIR
                          [PREFIX/share]
  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
                          [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
  --includedir=DIR        C header files in DIR [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
  --infodir=DIR           info documentation in DIR [PREFIX/info]
  --mandir=DIR            man documentation in DIR [PREFIX/man]
  --srcdir=DIR            find the sources in DIR [configure dir or ..]
  --program-prefix=PREFIX prepend PREFIX to installed program names
  --program-suffix=SUFFIX append SUFFIX to installed program names
  --program-transform-name=PROGRAM
                          run sed PROGRAM on installed program names
Host type:
  --build=BUILD           configure for building on BUILD [BUILD=HOST]
  --host=HOST             configure for HOST [guessed]
  --target=TARGET         configure for TARGET [TARGET=HOST]
Features and packages:
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --x-includes=DIR        X include files are in DIR
  --x-libraries=DIR       X library files are in DIR
--enable and --with options recognized:
  --with-libdir=NAME      Look for libraries in .../NAME rather than .../lib
  --disable-rpath         Disable passing additional runtime library
                          search paths
  --enable-re2c-cgoto     Enable -g flag to re2c to use computed goto gcc extension

SAPI modules:

  --with-aolserver=DIR    Specify path to the installed AOLserver
  --with-apxs[=FILE]      Build shared Apache 1.x module. FILE is the optional
                          pathname to the Apache apxs tool [apxs]
  --with-apache[=DIR]     Build Apache 1.x module. DIR is the top-level Apache
                          build directory [/usr/local/apache]
  --enable-mod-charset      APACHE: Enable transfer tables for mod_charset (Rus Apache)
  --with-apxs2filter[=FILE]
                          EXPERIMENTAL: Build shared Apache 2.0 Filter module. FILE is the optional
                          pathname to the Apache apxs tool [apxs]
  --with-apxs2[=FILE]     Build shared Apache 2.0 Handler module. FILE is the optional
                          pathname to the Apache apxs tool [apxs]
  --with-apache-hooks[=FILE]
                          EXPERIMENTAL: Build shared Apache 1.x module. FILE is the optional
                          pathname to the Apache apxs tool [apxs]
  --with-apache-hooks-static[=DIR]
                          EXPERIMENTAL: Build Apache 1.x module. DIR is the top-level Apache
                          build directory [/usr/local/apache]
  --enable-mod-charset      APACHE (hooks): Enable transfer tables for mod_charset (Rus Apache)
  --with-caudium[=DIR]    Build PHP as a Pike module for use with Caudium.
                          DIR is the Caudium server dir [/usr/local/caudium/server]
  --disable-cli           Disable building CLI version of PHP
                          (this forces --without-pear)
  --with-continuity=DIR   Build PHP as Continuity Server module.
                          DIR is path to the installed Continuity Server root
  --enable-embed[=TYPE]   EXPERIMENTAL: Enable building of embedded SAPI library
                          TYPE is either 'shared' or 'static'. [TYPE=shared]
  --with-isapi[=DIR]      Build PHP as an ISAPI module for use with Zeus
  --with-litespeed        Build PHP as litespeed module
  --with-milter[=DIR]     Build PHP as Milter application
  --with-nsapi=DIR        Build PHP as NSAPI module for Netscape/iPlanet/Sun Webserver
  --with-phttpd=DIR       Build PHP as phttpd module
  --with-pi3web[=DIR]     Build PHP as Pi3Web module
  --with-roxen=DIR        Build PHP as a Pike module. DIR is the base Roxen
                          directory, normally /usr/local/roxen/server
  --enable-roxen-zts        ROXEN: Build the Roxen module using Zend Thread Safety
  --with-thttpd=SRCDIR    Build PHP as thttpd module
  --with-tux=MODULEDIR    Build PHP as a TUX module (Linux only)
  --with-webjames=SRCDIR  Build PHP as a WebJames module (RISC OS only)
  --disable-cgi           Disable building CGI version of PHP

General settings:

  --enable-gcov           Enable GCOV code coverage (requires LTP) - FOR DEVELOPERS ONLY!!
  --enable-debug          Compile with debugging symbols
  --with-layout=TYPE      Set how installed files will be laid out.  Type can
                          be either PHP or GNU [PHP]
  --with-config-file-path=PATH
                          Set the path in which to look for php.ini [PREFIX/lib]
  --with-config-file-scan-dir=PATH
                          Set the path where to scan for configuration files
  --enable-safe-mode      Enable safe mode by default
  --with-exec-dir[=DIR]   Only allow executables in DIR under safe-mode
                          [/usr/local/php/bin]
  --enable-sigchild       Enable PHP's own SIGCHLD handler
  --enable-magic-quotes   Enable magic quotes by default.
  --enable-libgcc         Enable explicitly linking against libgcc
  --disable-short-tags    Disable the short-form <? start tag by default
  --enable-dmalloc        Enable dmalloc
  --disable-ipv6          Disable IPv6 support
  --enable-fd-setsize     Set size of descriptor sets

Extensions:

  --with-EXTENSION=[shared[,PATH]]

    NOTE: Not all extensions can be build as 'shared'.

    Example: --with-foobar=shared,/usr/local/foobar/

      o Builds the foobar extension as shared extension.
      o foobar package install prefix is /usr/local/foobar/


 --disable-all   Disable all extensions which are enabled by default

  --with-regex=TYPE       regex library type: system, php. [TYPE=php]
                          WARNING: Do NOT use unless you know what you are doing!
  --disable-libxml        Disable LIBXML support
  --with-libxml-dir[=DIR]   LIBXML: libxml2 install prefix
  --with-openssl[=DIR]    Include OpenSSL support (requires OpenSSL >= 0.9.6)
  --with-kerberos[=DIR]     OPENSSL: Include Kerberos support
  --with-pcre-regex=DIR   Include Perl Compatible Regular Expressions support.
                          DIR is the PCRE install prefix [BUNDLED]
  --with-zlib[=DIR]       Include ZLIB support (requires zlib >= 1.0.9)
  --with-zlib-dir=<DIR>   Define the location of zlib install directory
  --enable-bcmath         Enable bc style precision math functions
  --with-bz2[=DIR]        Include BZip2 support
  --enable-calendar       Enable support for calendar conversion
  --disable-ctype         Disable ctype functions
  --with-curl[=DIR]       Include cURL support
  --with-curlwrappers     Use cURL for url streams
  --enable-dba            Build DBA with bundled modules. To build shared DBA
                          extension use --enable-dba=shared
  --with-qdbm[=DIR]         DBA: QDBM support
  --with-gdbm[=DIR]         DBA: GDBM support
  --with-ndbm[=DIR]         DBA: NDBM support
  --with-db4[=DIR]          DBA: Berkeley DB4 support
  --with-db3[=DIR]          DBA: Berkeley DB3 support
  --with-db2[=DIR]          DBA: Berkeley DB2 support
  --with-db1[=DIR]          DBA: Berkeley DB1 support/emulation
  --with-dbm[=DIR]          DBA: DBM support
  --without-cdb[=DIR]       DBA: CDB support (bundled)
  --disable-inifile         DBA: INI support (bundled)
  --disable-flatfile        DBA: FlatFile support (bundled)
  --disable-dom           Disable DOM support
  --with-libxml-dir[=DIR]   DOM: libxml2 install prefix
  --enable-exif           Enable EXIF (metadata from images) support
  --disable-fileinfo      Disable fileinfo support
  --disable-filter        Disable input filter support
  --with-pcre-dir           FILTER: pcre install prefix
  --enable-ftp            Enable FTP support
  --with-openssl-dir[=DIR]  FTP: openssl install prefix
  --with-gd[=DIR]         Include GD support.  DIR is the GD library base
                          install directory [BUNDLED]
  --with-jpeg-dir[=DIR]     GD: Set the path to libjpeg install prefix
  --with-png-dir[=DIR]      GD: Set the path to libpng install prefix
  --with-zlib-dir[=DIR]     GD: Set the path to libz install prefix
  --with-xpm-dir[=DIR]      GD: Set the path to libXpm install prefix
  --with-freetype-dir[=DIR] GD: Set the path to FreeType 2 install prefix
  --with-t1lib[=DIR]        GD: Include T1lib support. T1lib version >= 5.0.0 required
  --enable-gd-native-ttf    GD: Enable TrueType string function
  --enable-gd-jis-conv      GD: Enable JIS-mapped Japanese font support
  --with-gettext[=DIR]    Include GNU gettext support
  --with-gmp[=DIR]        Include GNU MP support
  --with-mhash[=DIR]      Include mhash support
  --disable-hash          Disable hash support
  --without-iconv[=DIR]   Exclude iconv support
  --with-imap[=DIR]       Include IMAP support. DIR is the c-client install prefix
  --with-kerberos[=DIR]     IMAP: Include Kerberos support. DIR is the Kerberos install prefix
  --with-imap-ssl[=DIR]     IMAP: Include SSL support. DIR is the OpenSSL install prefix
  --with-interbase[=DIR]  Include InterBase support.  DIR is the InterBase base
                          install directory [/usr/interbase]
  --enable-intl           Enable internationalization support
  --with-icu-dir=DIR      Specify where ICU libraries and headers can be found
  --disable-json          Disable JavaScript Object Serialization support
  --with-ldap[=DIR]       Include LDAP support
  --with-ldap-sasl[=DIR]    LDAP: Include Cyrus SASL support
  --enable-mbstring       Enable multibyte string support
  --disable-mbregex         MBSTRING: Disable multibyte regex support
  --disable-mbregex-backtrack
                            MBSTRING: Disable multibyte regex backtrack check
  --with-libmbfl[=DIR]      MBSTRING: Use external libmbfl.  DIR is the libmbfl base
                            install directory [BUNDLED]
  --with-onig[=DIR]         MBSTRING: Use external oniguruma. DIR is the oniguruma install prefix.
                            If DIR is not set, the bundled oniguruma will be used
  --with-mcrypt[=DIR]     Include mcrypt support
  --with-msql[=DIR]       Include mSQL support.  DIR is the mSQL base
                          install directory [/usr/local/Hughes]
  --with-mssql[=DIR]      Include MSSQL-DB support.  DIR is the FreeTDS home
                          directory [/usr/local/freetds]
  --with-mysql[=DIR]      Include MySQL support.  DIR is the MySQL base
                          directory.  If mysqlnd is passed as DIR,
                          the MySQL native driver will be used [/usr/local]
  --with-mysql-sock[=DIR]   MySQL/MySQLi/PDO_MYSQL: Location of the MySQL unix socket pointer.
                            If unspecified, the default locations are searched
  --with-zlib-dir[=DIR]     MySQL: Set the path to libz install prefix
  --with-mysqli[=FILE]    Include MySQLi support.  FILE is the path
                          to mysql_config.  If mysqlnd is passed as FILE,
                          the MySQL native driver will be used [mysql_config]
  --enable-embedded-mysqli  MYSQLi: Enable embedded support
                            Note: Does not work with MySQL native driver!
  --with-oci8[=DIR]       Include Oracle (OCI8) support. DIR defaults to $ORACLE_HOME.
                          Use --with-oci8=instantclient,/path/to/oic/lib
                          for an Oracle Instant Client installation
  --with-adabas[=DIR]     Include Adabas D support [/usr/local]
  --with-sapdb[=DIR]      Include SAP DB support [/usr/local]
  --with-solid[=DIR]      Include Solid support [/usr/local/solid]
  --with-ibm-db2[=DIR]    Include IBM DB2 support [/home/db2inst1/sqllib]
  --with-ODBCRouter[=DIR] Include ODBCRouter.com support [/usr]
  --with-empress[=DIR]    Include Empress support [$EMPRESSPATH]
                          (Empress Version >= 8.60 required)
  --with-empress-bcs[=DIR]
                          Include Empress Local Access support [$EMPRESSPATH]
                          (Empress Version >= 8.60 required)
  --with-birdstep[=DIR]   Include Birdstep support [/usr/local/birdstep]
  --with-custom-odbc[=DIR]
                          Include user defined ODBC support. DIR is ODBC install base
                          directory [/usr/local]. Make sure to define CUSTOM_ODBC_LIBS and
                          have some odbc.h in your include dirs. f.e. you should define
                          following for Sybase SQL Anywhere 5.5.00 on QNX, prior to
                          running this configure script:
                              CPPFLAGS="-DODBC_QNX -DSQLANY_BUG"
                              LDFLAGS=-lunix
                              CUSTOM_ODBC_LIBS="-ldblib -lodbc"
  --with-iodbc[=DIR]      Include iODBC support [/usr/local]
  --with-esoob[=DIR]      Include Easysoft OOB support [/usr/local/easysoft/oob/client]
  --with-unixODBC[=DIR]   Include unixODBC support [/usr/local]
  --with-dbmaker[=DIR]    Include DBMaker support
  --enable-pcntl          Enable pcntl support (CLI/CGI only)
  --disable-pdo           Disable PHP Data Objects support
  --with-pdo-dblib[=DIR]    PDO: DBLIB-DB support.  DIR is the FreeTDS home directory
  --with-pdo-firebird[=DIR] PDO: Firebird support.  DIR is the Firebird base
                            install directory [/opt/firebird]
  --with-pdo-mysql[=DIR]    PDO: MySQL support. DIR is the MySQL base directoy
                                 If mysqlnd is passed as DIR, the MySQL native
                                 native driver will be used [/usr/local]
  --with-zlib-dir[=DIR]       PDO_MySQL: Set the path to libz install prefix
  --with-pdo-oci[=DIR]      PDO: Oracle OCI support. DIR defaults to $ORACLE_HOME.
                            Use --with-pdo-oci=instantclient,prefix,version
                            for an Oracle Instant Client SDK.
                            For Linux with 10.2.0.3 RPMs (for example) use:
                            --with-pdo-oci=instantclient,/usr,10.2.0.3
  --with-pdo-odbc=flavour,dir
                            PDO: Support for 'flavour' ODBC driver.
                            include and lib dirs are looked for under 'dir'.

                            'flavour' can be one of:  ibm-db2, iODBC, unixODBC, generic
                            If ',dir' part is omitted, default for the flavour
                            you have selected will used. e.g.:

                              --with-pdo-odbc=unixODBC

                            will check for unixODBC under /usr/local. You may attempt
                            to use an otherwise unsupported driver using the "generic"
                            flavour.  The syntax for generic ODBC support is:

                              --with-pdo-odbc=generic,dir,libname,ldflags,cflags

                            When build as shared the extension filename is always pdo_odbc.so
  --with-pdo-pgsql[=DIR]    PDO: PostgreSQL support.  DIR is the PostgreSQL base
                            install directory or the path to pg_config
  --without-pdo-sqlite[=DIR]
                            PDO: sqlite 3 support.  DIR is the sqlite base
                            install directory [BUNDLED]
  --with-pgsql[=DIR]      Include PostgreSQL support.  DIR is the PostgreSQL
                          base install directory or the path to pg_config
  --disable-phar          Disable phar support
  --disable-posix         Disable POSIX-like functions
  --with-pspell[=DIR]     Include PSPELL support.
                          GNU Aspell version 0.50.0 or higher required
  --with-libedit[=DIR]    Include libedit readline replacement (CLI/CGI only)
  --with-readline[=DIR]   Include readline support (CLI/CGI only)
  --with-recode[=DIR]     Include recode support
  --disable-session       Disable session support
  --with-mm[=DIR]           SESSION: Include mm support for session storage
  --enable-shmop          Enable shmop support
  --disable-simplexml     Disable SimpleXML support
  --with-libxml-dir=DIR     SimpleXML: libxml2 install prefix
  --with-snmp[=DIR]       Include SNMP support
  --with-openssl-dir[=DIR]  SNMP: openssl install prefix
  --enable-ucd-snmp-hack    SNMP: Enable UCD SNMP hack
  --enable-soap           Enable SOAP support
  --with-libxml-dir=DIR     SOAP: libxml2 install prefix
  --enable-sockets        Enable sockets support
  --without-sqlite=DIR    Do not include sqlite support.  DIR is the sqlite base
                          install directory [BUNDLED]
  --enable-sqlite-utf8      SQLite: Enable UTF-8 support for SQLite
  --without-sqlite3[=DIR] Do not include SQLite3 support. DIR is the prefix to
                          SQLite3 installation directory.
  --with-sybase-ct[=DIR]  Include Sybase-CT support.  DIR is the Sybase home
                          directory [/home/sybase]
  --enable-sysvmsg        Enable sysvmsg support
  --enable-sysvsem        Enable System V semaphore support
  --enable-sysvshm        Enable the System V shared memory support
  --with-tidy[=DIR]       Include TIDY support
  --disable-tokenizer     Disable tokenizer support
  --enable-wddx           Enable WDDX support
  --with-libxml-dir=DIR     WDDX: libxml2 install prefix
  --with-libexpat-dir=DIR   WDDX: libexpat dir for XMLRPC-EPI (deprecated)
  --disable-xml           Disable XML support
  --with-libxml-dir=DIR     XML: libxml2 install prefix
  --with-libexpat-dir=DIR   XML: libexpat install prefix (deprecated)
  --disable-xmlreader     Disable XMLReader support
  --with-libxml-dir=DIR     XMLReader: libxml2 install prefix
  --with-xmlrpc[=DIR]     Include XMLRPC-EPI support
  --with-libxml-dir=DIR     XMLRPC-EPI: libxml2 install prefix
  --with-libexpat-dir=DIR   XMLRPC-EPI: libexpat dir for XMLRPC-EPI (deprecated)
  --with-iconv-dir=DIR      XMLRPC-EPI: iconv dir for XMLRPC-EPI
  --disable-xmlwriter     Disable XMLWriter support
  --with-libxml-dir=DIR     XMLWriter: libxml2 install prefix
  --with-xsl[=DIR]        Include XSL support.  DIR is the libxslt base
                          install directory (libxslt >= 1.1.0 required)
  --enable-zip            Include Zip read/write support
  --with-zlib-dir[=DIR]     ZIP: Set the path to libz install prefix
  --with-pcre-dir           ZIP: pcre install prefix
  --enable-mysqlnd-threading
                            MYSQLND: Enable threaded fetch. Note: This forces ZTS on!

PEAR:

  --with-pear=DIR         Install PEAR in DIR [PREFIX/lib/php]
  --without-pear          Do not install PEAR

Zend:

  --with-zend-vm=TYPE     Set virtual machine dispatch method. Type is
                          one of CALL, SWITCH or GOTO [TYPE=CALL]
  --enable-maintainer-zts Enable thread safety - for code maintainers only!!
  --disable-inline-optimization
                          If building zend_execute.lo fails, try this switch
  --enable-zend-multibyte Compile with zend multibyte support

TSRM:

  --with-tsrm-pth[=pth-config]
                          Use GNU Pth
  --with-tsrm-st          Use SGI's State Threads
  --with-tsrm-pthreads    Use POSIX threads (default)

Libtool:

  --enable-shared[=PKGS]  build shared libraries [default=yes]
  --enable-static[=PKGS]  build static libraries [default=yes]
  --enable-fast-install[=PKGS]  optimize for fast installation [default=yes]
  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
  --disable-libtool-lock  avoid locking (might break parallel builds)
  --with-pic              try to use only PIC/non-PIC objects [default=use both]
  --with-tags[=TAGS]      include additional configurations [automatic]

  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]

Comme qui dirait, il y en a quelques unes ^^

Je me suis limité aux suivantes, qui couvrent les besoins que j'avais pour illustrer les nouveautés de PHP 5.3 :

./configure --prefix=/usr/ --with-apxs2=/usr/bin/apxs2 --with-config-file-path=/etc/php/ --disable-ipv6 --with-curl --enable-ftp --with-gd --enable-intl --enable-mbstring --with-mcrypt --with-mhash --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-soap --with-pear --with-xsl --with-zlib --with-openssl

Dans le principe, pour ne citer que quelques points :

  • PHP 5.3 devra être compilé vers /usr/, et la configuration ira dans /etc/php/
  • Nous n'avons pas besoin du support d'IP v6
  • Quelques extensions doivent être constuites : cURL, GD, intl, ...
  • Nous souhaitons utiliser le driver "mysqlnd" pour les trois extensions MySQL (mysql, mysqli, et PDO_MySQL).

Une fois cette commande lancée, configure va vérifier que vous avez installé tout ce qui sera nécessaire au processus de compilation -- en particulier, qu'il ne vous manque pas certaines bibliothèques, en version de développement (Cf la liste des paquets installés plus haut, typiquement).

Si tout se passe correctement, vous obtiendrez une sortie se terminant par quelque chose de ce genre :

Generating files
creating ./config.status
creating php5.spec
creating main/build-defs.h
creating scripts/phpize
creating scripts/man1/phpize.1
creating scripts/php-config
creating scripts/man1/php-config.1
creating sapi/cli/php.1
creating main/php_config.h
creating main/internal_functions.c
creating main/internal_functions_cli.c
+--------------------------------------------------------------------+
| License:                                                           |
| This software is subject to the PHP License, available in this     |
| distribution in the file LICENSE.  By continuing this installation |
| process, you are bound by the terms of this license agreement.     |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point.                            |
+--------------------------------------------------------------------+

Thank you for using PHP.

Dans le cas contraire, il vous faudra partir à la chasse des logiciels manquants... Bon courage !

Compilation

Maintenant que nous avons défini quoi compiler, nous n'avons plus qu'à lancer la compilation en elle-même :

make

Au bout de quelques minutes (selon performance de votre machine... Le fait de travailler dans une machine virtuelle n'arrangeant pas les choses), la compilation se termine :

Build complete.
Don't forget to run 'make test'.

Là encore, en cas d'erreur, il vous faudra partir à la chasse aux paquets manquants...
(Ou alors, vous avec eu la malchance de tomber sur un snapshot complètement foireux -- ça ne m'est jamais arrivé jusqu'à présent, ceci dit)

Exécution des tests

Une fois la compilation terminée, avant d'installer les logiciels que vous venez de compiler, il est recommandé de lancer les tests automatisés.
Considérant que vous construisez un environnement de test, vous pouvez choisir de sauter cette étape... Mais si vous n'êtes jamais passé par là, ça ne peut être qu'instructif de les lancer au moins une fois :

make test

Et en résultat :

=====================================================================
TEST RESULT SUMMARY
---------------------------------------------------------------------
Exts skipped    :   44
Exts tested     :   36
---------------------------------------------------------------------

Number of tests : 7789              6091
Tests skipped   : 1698 ( 21.8%) --------
Tests warned    :  134 (  1.7%) (  2.2%)
Tests failed    :   36 (  0.5%) (  0.6%)
Expected fail   :    3 (  0.0%) (  0.0%)
Tests passed    : 5918 ( 76.0%) ( 97.2%)
---------------------------------------------------------------------
Time taken      :  491 seconds
=====================================================================

Un bon nombre de tests réussis, quelques tests sautés, quelques échecs...
...Moué, ok... On verra si ça marche ^^


Installation et configuration de base

Il ne reste maintenant plus qu'à lancer la commande déclenchant l'installation
Note : Pour exécuter le processus d'installation, qui déploie des fichiers dans les répertoires système, vous devez être root

Installation

make install

Considérant la configuration d'Apache mise en place par Ubuntu, il y a de fortes chances que l'installation échoue lamentablement :

Installing PHP SAPI module:       apache2handler
/usr/share/apache2/build/instdso.sh SH_LIBTOOL='/usr/share/apr-1.0/build/libtool' libphp5.la /usr/lib/apache2/modules
/usr/share/apr-1.0/build/libtool --mode=install cp libphp5.la /usr/lib/apache2/modules/
cp .libs/libphp5.so /usr/lib/apache2/modules/libphp5.so
cp .libs/libphp5.lai /usr/lib/apache2/modules/libphp5.la
libtool: install: warning: remember to run `libtool --finish /home/php/temp/php5.3-200808211630/libs'
chmod 644 /usr/lib/apache2/modules/libphp5.so
apxs:Error: Activation failed for custom /etc/apache2/httpd.conf file..
apxs:Error: At least one `LoadModule' directive already has to exist..
make: *** [install-sapi] Error 1

En effet, les fichiers de configuration d'Apache ne sont pas organisés, sous Ubuntu, de la façon dont l'installeur de PHP les attend ; il ne parvient donc pas à les modifier pour y ajouter le chargement du module PHP.

Tant pis ; nous gérerons ce point là ultérieument, "à la main" ; en attendant, relançons l'installation, en ignorant les erreurs :

# make install --ignore-errors
Installing PHP SAPI module:       apache2handler
/usr/share/apache2/build/instdso.sh SH_LIBTOOL='/usr/share/apr-1.0/build/libtool' libphp5.la /usr/lib/apache2/modules
/usr/share/apr-1.0/build/libtool --mode=install cp libphp5.la /usr/lib/apache2/modules/
cp .libs/libphp5.so /usr/lib/apache2/modules/libphp5.so
cp .libs/libphp5.lai /usr/lib/apache2/modules/libphp5.la
libtool: install: warning: remember to run `libtool --finish /home/php/temp/php5.3-200808211630/libs'
chmod 644 /usr/lib/apache2/modules/libphp5.so
apxs:Error: Activation failed for custom /etc/apache2/httpd.conf file..
apxs:Error: At least one `LoadModule' directive already has to exist..
make: [install-sapi] Error 1 (ignored)
Installing PHP CLI binary:        /usr//bin/
Installing PHP CLI man page:      /usr//man/man1/
Installing build environment:     /usr//lib/php/build/
Installing header files:          /usr//include/php/
Installing helper programs:       /usr//bin/
  program: phpize
  program: php-config
Installing man pages:             /usr//man/man1/
  page: phpize.1
  page: php-config.1
Installing PEAR environment:      /usr//lib/php/
--04:52:08--  http://pear.php.net/install-pear-nozlib.phar
           => `pear/install-pear-nozlib.phar'
Resolving pear.php.net... 216.92.131.66
Connecting to pear.php.net|216.92.131.66|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3 642 880 (3.5M) [text/plain]

100%[=====================================================================================================================================================================================>] 3 642 880    105.07K/s    ETA 00:00

04:52:40 (112.63 KB/s) - `pear/install-pear-nozlib.phar' saved [3642880/3642880]

[PEAR] Console_Getopt - installed: 1.2.3
[PEAR] Archive_Tar    - installed: 1.3.2
[PEAR] Structures_Graph- installed: 1.0.2
pear/PEAR can optionally use package "pear/XML_RPC" (version >= 1.4.0)
[PEAR] PEAR           - installed: 1.7.2
Wrote PEAR system config file at: /usr//etc/pear.conf
You may want to add: /usr//lib/php to your php.ini include_path
/home/php/temp/php5.3-200808211630/build/shtool install -c ext/phar/phar.phar /usr//bin
Installing PDO headers:          /usr//include/php/ext/pdo/

Cette fois-ci, le processus d'installation a pu aller jusqu'au bout, malgré l'impossibilité d'ajouter le chargement de PHP à la configuration d'Apache.

On peut notamment noter l'installation des installeurs pear et pecl.

Configuration PHP

Maintenant que PHP est installé, il nous faut le configurer.

Pour cela, copions le fichier de configuration "recommandé", fourni avec PHP, vers l'emplacement indiqué plus haut, lors de la configuration de la configuration (Pour rappel : /etc/php/) :

mkdir /etc/php/
cp php.ini-recommended /etc/php/php.ini

De la sorte, ce fichier sera utilisé lors de l'exécution de php, que ce soit en ligne de commande, ou en tant que module Apache.

Pour nos tests, il peut être intéressant de modifier quelques points de configuration dans le fichier php.ini que nous venons de créer.
En particulier, activons le reporting et l'affichage d'erreurs :

error_reporting = E_ALL | E_STRICT
display_errors = On
html_errors = On

Cela nous facilitera la tâche lors des écritures de programmes de test !

Configuration Apache

Puisque -- du moins sous Ubuntu -- la modification de la configuration Apache a échoué lors de l'installation, il est temps de traiter ce point "manuellement".
A vous de voir comment charger un nouveau module sous votre système...

Sous Ubuntu, il faut créer un fichier de configuration dans le répertoire mods-available d'Apache :

# cat /etc/apache2/mods-available/php5.conf
<IfModule mod_php5.c>
  AddType application/x-httpd-php .php .phtml
  AddType application/x-httpd-php-source .phps
</IfModule>

Et un fichier chargeant le module :

# cat /etc/apache2/mods-available/php5.load
LoadModule php5_module /usr/lib/apache2/modules/libphp5.so

Et enfin, lier ces deux fichiers depuis le répertoire mods-enabled, pour qu'ils soient pris en compte au prochain rechargement d'Apache :

# ln -s /etc/apache2/mods-available/php5.conf /etc/apache2/mods-enabled/php5.conf
# ln -s /etc/apache2/mods-available/php5.load /etc/apache2/mods-enabled/php5.load

Et pour terminer, redémarrons Apache pour que la nouvelle configuration soit prise en compte :

/etc/init.d/apache2 restart

Et voila ! Un environnement Apache + PHP 5.3 installé et configuré !


Tester si PHP 5.3 est bien installé

A présent, vérifions si PHP 5.3 est bien installé...
Tout d'abord, vérifions l'installation de l'exécutable php, en l'appelant en ligne de commande :

$ php --version
PHP 5.3.0alpha3-dev (cli) (built: Sep 7 2008 16:53:20)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2008 Zend Technologies

La sortie que vous obtenez devrait se rapprocher de celle-ci ; la date de compilation changera, bien évidemment, et le numéro de version exact peut-être aussi.

Et pour vérifier que PHP est bien disponible en tant que module Apache, créez une page contenant un appel à phpinfo :

<?php
phpinfo();

Ce qui devrait donner quelque chose de ce genre -- et plus encore :

phpinfo-5.3.png

Si cette page s'affiche, contenant le bon numéro de version, c'est que votre installation a fonctionné :-)
Dans le cas cas contraire... Revoyez les étapes par lesquelles nous sommes passé... Et, au besoin, laissez un commentaire indiquant le problème.

A tout hasard, en cas de problème, assurez-vous d'avoir configuré Apache de manière à ce que son DocumentRoot pointe là où vous placez vos sources PHP ; ou créez un VirtualHost pointant sur votre répertoire de travail.
Typiquement, votre configuration Apache peut ressembler à ceci :

# cat /etc/apache2/sites-enabled/000-default
NameVirtualHost *
<VirtualHost *>
        ServerAdmin webmaster@localhost
        DocumentRoot /home/php/php53/
        <Directory /home/php/php53/>
                Options Indexes FollowSymLinks MultiViews +ExecCGI
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined
        ServerSignature On
</VirtualHost>


Quelques outils utiles

Avant de terminer, installons encore quelques outils, qui nous faciliteront les choses par la suite...

Installer Xdebug depuis pecl

Xdebug est une extension PHP fournissant -- entre autre -- des informations de debuggage en cas d'erreur ou d'exception.
Cette extension supporte PHP 5.3 depuis déjà plusieurs mois.
Nous allons l'installer, toujours sur notre machine virtuelle tournant sous Linux, depuis pecl.

Commençons par mettre à jour le channel :

# pecl channel-update pecl.php.net

Et passons ensuite à l'installation de Xdebug (Je tronque un peu la sortie) :

# pecl install xdebug

...
...
...

Build process completed successfully
Installing '/usr//lib/php/extensions/no-debug-non-zts-20071006/xdebug.so'
install ok: channel://pecl.php.net/xdebug-2.0.3
configuration option "php_ini" is not set to php.ini location
You should add "extension=xdebug.so" to php.ini

Vous noterez que j'ai sauté toutes les lignes en rapport avec la compilation de Xdebug, pour ne pas surcharger plus que nécessaire.

Et maintenant, il nous faut modifier notre fichier de configuration PHP (Encore une fois : /etc/php/php.ini) pour charger Xdebug, et activer quelques options.
Typiquement, rajoutez le passage suivant à la fin du fichier :

zend_extension=/usr//lib/php/extensions/no-debug-non-zts-20071006/xdebug.so
xdebug.default_enable = 1

xdebug.overload_var_dump = 1

xdebug.collect_includes = 1
xdebug.collect_params = 2
xdebug.collect_vars = 1
xdebug.show_exception_trace = 0
xdebug.show_mem_delta = 1
xdebug.max_nesting_level = 256
xdebug.var_display_max_children = 256
xdebug.var_display_max_data = 2048
xdebug.var_display_max_depth = 8

xdebug.auto_trace = 0

xdebug.profiler_enable = 0
xdebug.profiler_enable_trigger = 1
xdebug.profiler_append = 0
xdebug.profiler_output_dir = /tmp
xdebug.profiler_output_name = cachegrind.out.%t

Dans les grandes lignes, nous activons les traces en cas d'erreur et les var_dump améliorés, et désactivons le débugguer, que nous n'utiliserons pas.

Et pour que la modification soit prise en compte, redémarrez Apache :

/etc/init.d/apache2 restart

Xdebug devrait maintenant être visible en sortie de votre page phpinfo.

Un exemple typique d'utilisation ? Prenez cet exemple de trace d'exption, obtenue avec Xdebug installé et activé :

xdebug-exception-stacktrace.png

Différent de ce à quoi vous êtes habitué en temps normal, n'est-ce pas ?
Vous l'aurez compris : je n'imagine pas une machine de développement PHP sans Xdebug[2] !


Cela signifie que nous allons enfin pouvoir véritablement nous attaquer aux nouveautés de PHP 5.3... Dès le prochain article !


Notes

[1] La version 8.10 de Ubuntu n'était pas encore sortie lorsque j'ai commencé à rédiger cette série d'articles -- les différences avec la version 8.04 ne devraient pas être bien importantes au niveau des logiciels qui nous intéressent, quoi qu'il en soit

[2] Par contre, n'installez pas Xdebug sur une machine de production : ça ne serait absolument pas judicieux -- notamment pour ce qui est des performances ! Pensez plutôt, par exemple, à APC ;-)