vendredi 17 juin 2011

Compiler PHP pour page perso free.fr

Vous avez des pages persos free.fr, mais la version PHP que vous utilisez pour votre développement n'est pas la même et certaines fonctionnalités manquent. Cet article vous explique comment compiler une version de PHP proche de celle des pages persos de free.

Versions :
  • Fedora 16
  • Lighttpd 1.4.28
  • PHP 5.1.3
Sur les serveurs free la version de PHP est la 5.1.3RC4-dev. J'imagine donc que la version finale de la 5.1.3 est la plus proche.
Vous la trouverez ici.



Compilation de PHP

On va ajouter comme prfixe d'installation /usr/local/php-free.fr pour ne pas mélanger cette version avec celles déjà existantes sur le système.

 On extrait l'archive :
 $> tar -zxvf php-5.1.3.tar.gz
 $> cd php-5.1.3

Pour les dépendances (sous Fedora) :

 #> yum-builddep php

Configuration avant compilation :
 $> ./configure --with-libdir=lib64 --prefix=/usr/local/php-free.fr --program-suffix=-cgi --enable-safe-mode --disable-ipv6 --enable-discard-path --disable-cli --enable-fastcgi --enable-force-cgi-redirect --enable-memory-limit --with-zlib --enable-bcmath --with-bz2 --enable-calendar --with-curl --enable-exif --with-gd --with-ttf --with-t1lib --enable-mbstring --with-gettext --with-mcrypt --with-mhash --with-mysql --enable-sockets --enable-sqlite-utf8 --enable-wddx --with-xsl --with-inifile


Pour postgres :
 --with-pgsql

Si vous utilisez les bases de données Berkley et autres :
 --enable-dba --with-gdbm --with-db4 --with-cdb --with-flatfile

Attention l'option --with-libdir=lib64 est à ajouter seulement si votre système est 64 bits et qu'il installe les librairies dans le dossier /usr/lib64.

Puis classiquement :
$> make
$> su -c 'make install'

Erreurs  récurrentes :
'CURLOPT_FTPASCII' undeclared (first use in this function)
'CURLOPT_PASSWDFUNCTION' undeclared (first use in this function)
Supprimer la ligne 309 et insérer #define CURLOPT_FTPASCII CURLOPT_TRANSFERTEXT  à la ligne 240 du fichier ./ext/curl/interface.c.

Sous mageia, j'ai eu un problème car l'appel à curl-config qui ne retournait pas de résultat valide :
$> curl-config --version
libcurl -
Au lieu de libcurl 7.21.5 (je n'ai pas eu ce problème sous Fedora).
Pour éviter le problème éditer le fichier /usr/bin/multiarch-x86_64-linux/curl-config :
  • soit écrire directement libcurl X.XX.X suivant la version que vous avez
  • soit remplacer libcurl - par echo libcurl `curl --version | grep libcurl | sed 's/curl //' | sed -e 's/ .*//'`
C'est pas très digeste mais ça soigne ;).

Configuration de Lighttpd

J'utilise lighttpd car je le trouve plus simple à configurer que apache pour ce genre de chose.

On va utiliser les modules fastcgi et simple vhost.

Pour fastcgi :
##
##  /etc/lighttpd/conf.d/fastcgi.conf
## ----------------------------------
##
server.modules += ( "mod_fastcgi" )

fastcgi.map-extensions = ( ".php3" => ".php", ".php4" => ".php" )

fastcgi.server = ( ".php" => ( "localhost" => (
    "bin-path" => "/usr/bin/php-cgi",
    "socket" => socket_dir + "/php-fastcgi.socket",
    "max-procs" => 10,
    "bin-environment" => (
        "PHP_FCGI_CHILDREN" => "10",
        "PHP_FCGI_MAX_REQUESTS" => "4000"
    ),
    "bin-copy-environment" => (
        "PATH", "SHELL", "USER"
    ),
    "broken-scriptfilename" => "enable"
)))
Ce fichier est donné en exemple de configuration car seule la première ligne est réellement utile pour notre configuration.
Bien sûr la configuration ici est pour la version officielle de PHP de ma distro.

Pour simple_vhost :

##
##  /etc/lighttpd/conf.d/simple_vhost.conf
## ---------------------------------------
##
server.modules += ( "mod_simple_vhost" )

$HTTP["host"] != "localhost" {
    simple-vhost.server-root   = "/home/luc/Public"
    simple-vhost.default-host  = ""
    simple-vhost.document-root = "www"
}



Et enfin voici mon fichier de configuration de mon hôte virtuel :
##
##  /etc/lighttpd/vhosts.d/monsite.conf
## ---------------------------------------
##
$HTTP["host"] == "luc.free\.loc" {
  fastcgi.server = ( ".php" => ( "free.loc
" => (
      "bin-path" => "/usr/local/php-free.fr/bin/php-cgi",
      "socket" => socket_dir + "/php-free
.socket",
      "max-procs" => 1,
      "bin-environment" => (
          "PHP_FCGI_CHILDREN" => "10",
          "PHP_FCGI_MAX_REQUESTS" => "250"
      ),
      "bin-copy-environment" => (
          "PATH", "SHELL", "USER"
      ),
      "broken-scriptfilename" => "enable"
  )))

  simple-vhost.server-root  = "/home/luc/Public/"
  simple-vhost.default-host  = "luc.free.loc"
  simple-vhost.document-root = "/"
}

La première partie sert à utiliser la version de PHP nouvellement compilé. et la deuxième redirige les url du type http://luc.free.loc/path/to/file.php vers le script /home/luc/Public/luc/path/to/file.php.

Le php.ini

Pour terminer la configuration il faut modifier certaines valeurs de variables de php.
Attention dans votre développement vous pouvez modifier ces valeurs avec l'appel à ini_set(), certaines valeurs ne sont pas modifiable chez free, je vous conseille de ne pas l'utiliser.

; /usr/local/php-free.fr/lib/php.ini
[PHP]
asp_tags = On
error_reporting = 65535
include_path = "
/home/luc/Public/luc.free.fr/include:.:/usr/local/php-free.fr/lib/php"
max_execution_time = 20
max_input_time = 60
memory_limit = 32M
output_buffering =
post_max_size = 3M
safe_mode_exec_dir =

[general]
default_socket_timeout = 5

[fcgi]
cgi.fix_pathinfo = On

[mbstring]
mbstring.internal_encoding =

[pgsql]
pgsql.max_links = 1

Mises en garde :
  • avec cette configuration les fichiers de sessions ne sont pas stocké dans le dossier sessions.
  • Cette configuration est spécifique à un seul site (cf include_path).

Pour finir

Pour tester j'ai créé des fichiers info.php qui contiennent <?php phpinfo(); ?> dans les dossiers /home/luc/Public/luc, /var/www/lighttpd.

 # service lighttpd start


Reste plus qu'à tester les adresse http://localhost/info.php et http://luc.free.loc/info.php et voir si les versions de PHP diffèrent.

Pour les utilisateurs de Fedora il faut résoudre le problème de contexte de SELinux pour lancer lighttpd :
 # restorecon -v /usr/local/php-free.fr/bin/php-cgi
Et pour les fichiers :
 $ chcon -R -h -t httpd_sys_content_t /home/luc/Public/luc.free.loc

Aucun commentaire:

Enregistrer un commentaire