Planet Fedora-Fr

fedora-fr fedora-fr

Aller au contenu | Aller au menu | Aller à la recherche

Mot clé - Fiches explicatives

Fil des billets - Fil des commentaires

vendredi, mai 9 2008

English This is a quick installation Guide for OCS Inventory NG and GLPI. A english translation will probably be posted (sooner or later).

Français Cet article est un guide d'installation rapide pour OCS Inventory NG and GLPI.

Pré-requis Ce guide est destiné aux distributions Fedora, RHEL et CentOS qui propose OCS et GLPI au format RPM dans leurs dépôts officiels (ou ici, donc en activant mon dépôt). On considère que la machine est vierge, en particulier que le serveur MySQL n'est ni installé, ni configuré. Pour plus d'information sur l'installation et la... Lire

Billet original sur Les RPM de Remi

 
 

dimanche, avril 27 2008

English A small introduction on using MySQL in strict mode to improve development quality.

Documentation : SQL Mode.

Français Une petite introduction sur l'utilisation de MySQL en mode strict pour améliorer la qualité du développement.

Documentation :

Un des reproches couramment fait à MySQL est son manque de respect des standards du Langage SQL. Et en effet il est vrai qu'il peut sembler laxiste. Cependant, il est possible de modifier son comportement pour respecter de manière plus stricte les standards. Ces options ne sont pas activées par défaut pour ne pas bloquer le fonctionnement des applications existantes.

Un exemple en mode classique :

mysql> CREATE TABLE `essai`.`Test` (
-> `Ref` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
-> `Nom` VARCHAR( 10 ) NOT NULL ,
-> `Dat` DATE NOT NULL ,
-> PRIMARY KEY ( `Ref` )
-> ) ENGINE = innodb CHARACTER SET utf8 COMMENT = 'Test SQL Mode';
Query OK, 0 rows affected (0.00 sec)
mysql> SET sql_mode='';
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO Test SET Nom="Hello";
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> INSERT INTO Test SET Nom='Hello';
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> INSERT INTO Test SET Nom='empty date', Dat='';
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> INSERT INTO Test SET Nom='2008-04-31', Dat='2008-04-31';
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> INSERT INTO Test SET Nom='2008-05-01', Dat='2008-05-01';
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO Test SET Nom='Very long string', Dat=NOW();
Query OK, 1 row affected, 2 warnings (0.00 sec)
mysql> SELECT * From Test;
+-----+------------+------------+
| Ref | Nom | Dat |
+-----+------------+------------+
| 1 | Hello | 0000-00-00 |
| 2 | Hello | 0000-00-00 |
| 3 | empty date | 0000-00-00 |
| 4 | 2008-04-31 | 0000-00-00 |
| 5 | 2008-05-01 | 2008-05-01 |
| 6 | Very long | 2008-04-27 |
+-----+------------+------------+

On voit ici que toutes les requêtes sont acceptées, et que les résultats ne correspondent pas forcément au but rechercher par le développeur.

Maintenant, la même chose en mode strict :

mysql> TRUNCATE Test;
Query OK, 6 rows affected (0.01 sec)
mysql> SET sql_mode='STRICT_ALL_TABLES,ANSI_QUOTES,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE';
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO Test SET Nom="Hello";
ERROR 1054 (42S22): Unknown column 'Hello' in 'field list'
mysql> INSERT INTO Test SET Nom='Hello';
ERROR 1364 (HY000): Field 'Dat' doesn't have a default value
mysql> INSERT INTO Test SET Nom='empty date', Dat='';
ERROR 1292 (22007): Incorrect date value: '' for column 'Dat' at row 1
mysql> INSERT INTO Test SET Nom='2008-04-31', Dat='2008-04-31';
ERROR 1292 (22007): Incorrect date value: '2008-04-31' for column 'Dat' at row 1
mysql> INSERT INTO Test SET Nom='2008-05-01', Dat='2008-05-01';
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO Test SET Nom='Very long string', Dat=NOW();
ERROR 1406 (22001): Data too long for column 'Nom' at row 1
mysql> SELECT * From Test;
+-----+------------+------------+
| Ref | Nom | Dat |
+-----+------------+------------+
| 1 | 2008-05-01 | 2008-05-01 |
+-----+------------+------------+
1 row in set (0.00 sec)

Lorsque ce mode est activé, seule les requêtes totalement valides sont exécutées. Il est souvent préférable d'avoir un message d'erreur que d'accepter l'enregistrement de données corrompues.

De plus, il semblerait que certaines distributions de MySQL active désormais le mode strict par défaut (notament sous Windows). Cela peut provoquer de très mauvaises surprises si vos développements ne sont pas impeccables.

Conclusion

Si vous développez avec MySQL je vous recommande donc d'activer le mode strict, cela vous permettra de vérifier la qualité de votre code et d'éviter de nombreux rapport de bugs de vos utilisateurs. Pour cela, dans le fichier de configuration (/etc/my.cnf), ajouter dans la section du serveur ([mysqld]) :

sql-mode=STRICT_ALL_TABLES

Voir, encore plus exigeant :

sql-mode=STRICT_ALL_TABLES,ANSI_QUOTES,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE

N'oubliez pas de consulter la documentation pour bien comprendre l'impact de chacune des options disponibles. Plus vous serez exigeant, plus votre code a de chance d'être portable.

Au travail !

Billet original sur Les RPM de Remi

 
 

samedi, février 2 2008

English A lot of users are misleaded by the output of phpinfo function. The "configure command" give informations about the build options but nothing valuable about the available modules.

Français Beaucoup d'utilisateurs sont trompés par la sortie de la fonction phpinfo.

Le problème revient très (trop) régulièrement sur les forums et les autres sources d'aide : "dois-je recompiler php pour avoir l'option mysql car il est construit avec l'option--without-mysql ?". (pour diverses extensions)

Un peu d'explications : la partie "Configure command" correspond exactement à son nom, c'est à dire aux options passées à configure lors de la compilation de l'application.

Dans le cas des RPM de Fedora / RHEL / CentOS / Remi, php est construit plusieurs fois :

  • Une première fois sans aucune extension pour le module apache.
  • Une deuxième fois avec beaucoup d'extensions pour la commande php. Les extensions sont construite en mode partagé (shared) de manière à pouvoir être distribuées séparément.
  • Une troisième fois pour la bibliothèque php (utilisation embarquée du langage)

Donc dans le cas du module apache, la sortie contient :

'./configure' '--build=x86_64-redhat-linux-gnu' '--host=x86_64-redhat-linux-gnu' '--target=x86_64-redhat-linux-gnu' '--program-prefix=' '--prefix=/usr' '--exec-prefix=/usr' '--bindir=/usr/bin' '--sbindir=/usr/sbin' '--sysconfdir=/etc' '--datadir=/usr/share' '--includedir=/usr/include' '--libdir=/usr/lib64' '--libexecdir=/usr/libexec' '--localstatedir=/var' '--sharedstatedir=/usr/com' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--cache-file=../config.cache' '--with-libdir=lib64' '--with-config-file-path=/etc' '--with-config-file-scan-dir=/etc/php.d' '--disable-debug' '--with-pic' '--disable-rpath' '--without-pear' '--with-bz2' '--with-curl' '--with-exec-dir=/usr/bin' '--with-freetype-dir=/usr' '--with-png-dir=/usr' '--enable-gd-native-ttf' '--without-gdbm' '--with-gettext' '--with-gmp' '--with-iconv' '--with-jpeg-dir=/usr' '--with-openssl' '--with-png' '--with-pspell' '--with-expat-dir=/usr' '--with-pcre-regex=/usr' '--with-zlib' '--with-layout=GNU' '--enable-exif' '--enable-ftp' '--enable-magic-quotes' '--enable-sockets' '--enable-sysvsem' '--enable-sysvshm' '--enable-sysvmsg' '--enable-track-vars' '--enable-trans-sid' '--enable-yp' '--enable-wddx' '--with-kerberos' '--enable-ucd-snmp-hack' '--with-unixODBC=shared,/usr' '--enable-memory-limit' '--enable-shmop' '--enable-calendar' '--enable-dbx' '--enable-dio' '--without-mime-magic' '--with-libxml-dir=/usr' '--with-xml' '--with-apxs2=/usr/sbin/apxs' '--without-mysql' '--without-gd' '--without-odbc' '--disable-dom' '--disable-dba' '--without-unixODBC' '--disable-pdo' '--disable-xmlreader' '--disable-xmlwriter' '--without-sqlite' '--disable-json'

Même si un module n'était pas activé lors de la construction il peut être installé et apparait alors plus bas dans la page.

Tandis qu'en ligne de commande, on obtient (php --info) :

Configure Command => './configure' '--build=x86_64-redhat-linux-gnu' '--host=x86_64-redhat-linux-gnu' '--target=x86_64-redhat-linux-gnu' '--program-prefix=' '--prefix=/usr' '--exec-prefix=/usr' '--bindir=/usr/bin' '--sbindir=/usr/sbin' '--sysconfdir=/etc' '--datadir=/usr/share' '--includedir=/usr/include' '--libdir=/usr/lib64' '--libexecdir=/usr/libexec' '--localstatedir=/var' '--sharedstatedir=/usr/com' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--cache-file=../config.cache' '--with-libdir=lib64' '--with-config-file-path=/etc' '--with-config-file-scan-dir=/etc/php.d' '--disable-debug' '--with-pic' '--disable-rpath' '--without-pear' '--with-bz2' '--with-curl' '--with-exec-dir=/usr/bin' '--with-freetype-dir=/usr' '--with-png-dir=/usr' '--enable-gd-native-ttf' '--without-gdbm' '--with-gettext' '--with-gmp' '--with-iconv' '--with-jpeg-dir=/usr' '--with-openssl' '--with-png' '--with-pspell' '--with-expat-dir=/usr' '--with-pcre-regex=/usr' '--with-zlib' '--with-layout=GNU' '--enable-exif' '--enable-ftp' '--enable-magic-quotes' '--enable-sockets' '--enable-sysvsem' '--enable-sysvshm' '--enable-sysvmsg' '--enable-track-vars' '--enable-trans-sid' '--enable-yp' '--enable-wddx' '--with-kerberos' '--enable-ucd-snmp-hack' '--with-unixODBC=shared,/usr' '--enable-memory-limit' '--enable-shmop' '--enable-calendar' '--enable-dbx' '--enable-dio' '--without-mime-magic' '--with-libxml-dir=/usr' '--with-xml' '--enable-force-cgi-redirect' '--enable-pcntl' '--with-imap=shared' '--with-imap-ssl' '--enable-mbstring=shared' '--enable-mbstr-enc-trans' '--enable-mbregex' '--with-ncurses=shared' '--with-gd=shared' '--enable-bcmath=shared' '--enable-dba=shared' '--with-db4=/usr' '--with-xmlrpc=shared' '--with-ldap=shared' '--with-ldap-sasl' '--with-mysql=shared,/usr' '--with-mysqli=shared,/usr/bin/mysql_config' '--with-oci8=shared,instantclient,/usr/lib64/oracle/10.2.0.3/client/lib,10.2.0.3' '--with-pdo-oci=shared,instantclient,/usr,10.2.0.3' '--enable-dom=shared' '--with-dom-xslt=/usr' '--with-dom-exslt=/usr' '--with-pgsql=shared' '--with-snmp=shared,/usr' '--enable-soap=shared' '--with-xsl=shared,/usr' '--enable-xmlreader=shared' '--enable-xmlwriter=shared' '--enable-fastcgi' '--enable-pdo=shared' '--with-pdo-odbc=shared,unixODBC,/usr' '--with-pdo-mysql=shared,/usr' '--with-pdo-pgsql=shared,/usr' '--with-pdo-sqlite=shared,/usr' '--with-sqlite=shared,/usr' '--enable-json=shared' '--enable-zip=shared' '--with-readline' '--enable-dbase=shared' '--with-mcrypt=shared,/usr' '--with-mhash=shared,/usr' '--with-tidy=shared,/usr' '--with-mssql=shared,/usr'

Même si un module est activé lors de la construction, il n'est pas forcément installé s'il n'apparait pas plus loin dans la liste.

Donc, les seules sources fiables de renseignement sont :

$ rpm -qa php\* $ php --modules

Voila, alors, à votre avis, BUG ou PEBKAC ?

Et pour finir, ne pas oublier de relancer le serveur apache après l'installation d'un nouveau module.

Documentations sur fedora-fr.org :

Billet original sur Les RPM de Remi

 
 

English A lot of users are misleaded by the output of phpinfo function. The "configure command" give informations about the build options but nothing valuable about the available modules.

Français Beaucoup d'utilisateurs sont trompés par la sortie de la fonction phpinfo.

Le problème revient très (trop) régulièrement sur les forums et les autres sources d'aide : "dois-je recompiler php pour avoir l'option mysql car il est construit avec l'option--without-mysql ?". (pour diverses extensions)

Un peu d'explications : la partie "Configure command" correspond exactement à son nom, c'est à dire aux options passées à configure lors de la compilation de l'application.

Dans le cas des RPM de Fedora / RHEL / CentOS / Remi, php est construit plusieurs fois :

  • Une première fois sans aucune extension pour le module apache.
  • Une deuxième fois avec beaucoup d'extensions pour la commande php. Les extensions sont construite en mode partagé (shared) de manière à pouvoir être distribuées séparément.
  • Une troisième fois pour la bibliothèque php (utilisation embarquée du langage)

Donc dans le cas du module apache, la sortie contient :

'./configure' '--build=x86_64-redhat-linux-gnu' '--host=x86_64-redhat-linux-gnu' '--target=x86_64-redhat-linux-gnu' '--program-prefix=' '--prefix=/usr' '--exec-prefix=/usr' '--bindir=/usr/bin' '--sbindir=/usr/sbin' '--sysconfdir=/etc' '--datadir=/usr/share' '--includedir=/usr/include' '--libdir=/usr/lib64' '--libexecdir=/usr/libexec' '--localstatedir=/var' '--sharedstatedir=/usr/com' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--cache-file=../config.cache' '--with-libdir=lib64' '--with-config-file-path=/etc' '--with-config-file-scan-dir=/etc/php.d' '--disable-debug' '--with-pic' '--disable-rpath' '--without-pear' '--with-bz2' '--with-curl' '--with-exec-dir=/usr/bin' '--with-freetype-dir=/usr' '--with-png-dir=/usr' '--enable-gd-native-ttf' '--without-gdbm' '--with-gettext' '--with-gmp' '--with-iconv' '--with-jpeg-dir=/usr' '--with-openssl' '--with-png' '--with-pspell' '--with-expat-dir=/usr' '--with-pcre-regex=/usr' '--with-zlib' '--with-layout=GNU' '--enable-exif' '--enable-ftp' '--enable-magic-quotes' '--enable-sockets' '--enable-sysvsem' '--enable-sysvshm' '--enable-sysvmsg' '--enable-track-vars' '--enable-trans-sid' '--enable-yp' '--enable-wddx' '--with-kerberos' '--enable-ucd-snmp-hack' '--with-unixODBC=shared,/usr' '--enable-memory-limit' '--enable-shmop' '--enable-calendar' '--enable-dbx' '--enable-dio' '--without-mime-magic' '--with-libxml-dir=/usr' '--with-xml' '--with-apxs2=/usr/sbin/apxs' '--without-mysql' '--without-gd' '--without-odbc' '--disable-dom' '--disable-dba' '--without-unixODBC' '--disable-pdo' '--disable-xmlreader' '--disable-xmlwriter' '--without-sqlite' '--disable-json'

Même si un module n'était pas activé lors de la construction il peut être installé et apparait alors plus bas dans la page.

Tandis qu'en ligne de commande, on obtient (php --info) :

Configure Command => './configure' '--build=x86_64-redhat-linux-gnu' '--host=x86_64-redhat-linux-gnu' '--target=x86_64-redhat-linux-gnu' '--program-prefix=' '--prefix=/usr' '--exec-prefix=/usr' '--bindir=/usr/bin' '--sbindir=/usr/sbin' '--sysconfdir=/etc' '--datadir=/usr/share' '--includedir=/usr/include' '--libdir=/usr/lib64' '--libexecdir=/usr/libexec' '--localstatedir=/var' '--sharedstatedir=/usr/com' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--cache-file=../config.cache' '--with-libdir=lib64' '--with-config-file-path=/etc' '--with-config-file-scan-dir=/etc/php.d' '--disable-debug' '--with-pic' '--disable-rpath' '--without-pear' '--with-bz2' '--with-curl' '--with-exec-dir=/usr/bin' '--with-freetype-dir=/usr' '--with-png-dir=/usr' '--enable-gd-native-ttf' '--without-gdbm' '--with-gettext' '--with-gmp' '--with-iconv' '--with-jpeg-dir=/usr' '--with-openssl' '--with-png' '--with-pspell' '--with-expat-dir=/usr' '--with-pcre-regex=/usr' '--with-zlib' '--with-layout=GNU' '--enable-exif' '--enable-ftp' '--enable-magic-quotes' '--enable-sockets' '--enable-sysvsem' '--enable-sysvshm' '--enable-sysvmsg' '--enable-track-vars' '--enable-trans-sid' '--enable-yp' '--enable-wddx' '--with-kerberos' '--enable-ucd-snmp-hack' '--with-unixODBC=shared,/usr' '--enable-memory-limit' '--enable-shmop' '--enable-calendar' '--enable-dbx' '--enable-dio' '--without-mime-magic' '--with-libxml-dir=/usr' '--with-xml' '--enable-force-cgi-redirect' '--enable-pcntl' '--with-imap=shared' '--with-imap-ssl' '--enable-mbstring=shared' '--enable-mbstr-enc-trans' '--enable-mbregex' '--with-ncurses=shared' '--with-gd=shared' '--enable-bcmath=shared' '--enable-dba=shared' '--with-db4=/usr' '--with-xmlrpc=shared' '--with-ldap=shared' '--with-ldap-sasl' '--with-mysql=shared,/usr' '--with-mysqli=shared,/usr/bin/mysql_config' '--with-oci8=shared,instantclient,/usr/lib64/oracle/10.2.0.3/client/lib,10.2.0.3' '--with-pdo-oci=shared,instantclient,/usr,10.2.0.3' '--enable-dom=shared' '--with-dom-xslt=/usr' '--with-dom-exslt=/usr' '--with-pgsql=shared' '--with-snmp=shared,/usr' '--enable-soap=shared' '--with-xsl=shared,/usr' '--enable-xmlreader=shared' '--enable-xmlwriter=shared' '--enable-fastcgi' '--enable-pdo=shared' '--with-pdo-odbc=shared,unixODBC,/usr' '--with-pdo-mysql=shared,/usr' '--with-pdo-pgsql=shared,/usr' '--with-pdo-sqlite=shared,/usr' '--with-sqlite=shared,/usr' '--enable-json=shared' '--enable-zip=shared' '--with-readline' '--enable-dbase=shared' '--with-mcrypt=shared,/usr' '--with-mhash=shared,/usr' '--with-tidy=shared,/usr' '--with-mssql=shared,/usr'

Même si un module est activé lors de la construction, il n'est pas forcément installé s'il n'apparait pas plus loin dans la liste.

Donc, les seules sources fiables de renseignement sont :

$ rpm -qa php\* $ php --modules

Voila, alors, à votre avis, BUG ou PEBKAC ?

Et pour finir, ne pas oublier de relancer le serveur apache après l'installation d'un nouveau module.

Documentations sur fedora-fr.org :

Billet original sur Les RPM de Remi

 
 

dimanche, décembre 23 2007

English Here is a very small guide to perform a PHP code profiling.

Français Voici un petit guide pour réaliser le pofil d'un programme PHP.

Lorsqu'un script PHP est trop long à l'exécution, il peut-être utile d'établir son profil afin de déterminer les fonctions nécessitant une optimisation.

Source : Profiling PHP Scripts sur http://xdebug.org/

Installation des outils

Il faut commencer par installer l'extension xdebug disponible dans les dépôts Fedora :

yum install php-pecl-xdebug

Puis installer l'outil d'analyse graphique des traces : KCacheGrind

yum install kdesdk

Configurer et activer l'outil d'enregistrement des traces

Après son installation, l'extension est activé dans le fichier /etc/php.d/xdebug.ini. On pourra modifier ce fichier.

; Activation de l'extension xdebug zend_extension=/usr/lib64/php/modules/xdebug.so ; Activation de l'enregistrement des traces xdebug.profiler_enable=1 ; Dossier d'enregistrement xdebug.profiler_output_dir=/tmp

A l'issu des tests, il est préférable de désactiver ces options qui pénalisent très sensiblement les performances.

Enregistrer des traces

Dans le cas d'un script en ligne de commande, il suffit de le lancer.

Dans le cas d'une application web, il est préférable d'exécuter apache en mode debug pour éviter la création de processus multiples qui auront chacun leur fichier de traces.

service httpd stop httpd -X

Après avoir utiliser l'application, il suffira d'arreter apache en le tuant (Ctrl-C).

Les traces sont collectées dans le fichier /tmp/cachegrind.out.####, (ou #### est le numéro du processus).

Analyse des traces

Il suffit de lancer l'application KCacheGrind (menu Applications / Programmation) et d'ouvrir le fichier créé.

Le premier état permet de connaitre rapidement les fonctions qui consomme le plus de temps d'exécution :

Qu'il est possible de visualiser graphiquement :

Un autre graphique permet de voir les enchainements d'appels de manière simple, avec la consommation de temps très lisible :

A noter qu'il est aussi possible de consulter directement les sources du script depuis l'application.

Conclusion

Il ne s'agit que d'un petit guide pour vous mettre sur la voie. A vous de découvrir maintenant plus en détail les possibilités de ces outils.

Ils m'ont permis de découvrir plusieurs points d'optimisation et de réaliser des gains de performances significatifs dans mes développements.

Billet original sur Les RPM de Remi

 
 

English Here is a very small guide to perform a PHP code profiling.

Français Voici un petit guide pour réaliser le pofil d'un programme PHP.

Lorsqu'un script PHP est trop long à l'exécution, il peut-être utile d'établir son profil afin de déterminer les fonctions nécessitant une optimisation.

Source : Profiling PHP Scripts sur http://xdebug.org/

Installation des outils

Il faut commencer par installer l'extension xdebug disponible dans les dépôts Fedora :

yum install php-pecl-xdebug

Puis installer l'outil d'analyse graphique des traces : KCacheGrind

yum install kdesdk

Configurer et activer l'outil d'enregistrement des traces

Après son installation, l'extension est activé dans le fichier /etc/php.d/xdebug.ini. On pourra modifier ce fichier.

; Activation de l'extension xdebug zend_extension=/usr/lib64/php/modules/xdebug.so ; Activation de l'enregistrement des traces xdebug.profiler_enable=1 ; Dossier d'enregistrement xdebug.profiler_output_dir=/tmp

A l'issu des tests, il est préférable de désactiver ces options qui pénalisent très sensiblement les performances.

Enregistrer des traces

Dans le cas d'un script en ligne de commande, il suffit de le lancer.

Dans le cas d'une application web, il est préférable d'exécuter apache en mode debug pour éviter la création de processus multiples qui auront chacun leur fichier de traces.

service httpd stop httpd -X

Après avoir utiliser l'application, il suffira d'arreter apache en le tuant (Ctrl-C).

Les traces sont collectées dans le fichier /tmp/cachegrind.out.####, (ou #### est le numéro du processus).

Analyse des traces

Il suffit de lancer l'application KCacheGrind (menu Applications / Programmation) et d'ouvrir le fichier créé.

Le premier état permet de connaitre rapidement les fonctions qui consomme le plus de temps d'exécution :

Qu'il est possible de visualiser graphiquement :

Un autre graphique permet de voir les enchainements d'appels de manière simple, avec la consommation de temps très lisible :

A noter qu'il est aussi possible de consulter directement les sources du script depuis l'application.

Conclusion

Il ne s'agit que d'un petit guide pour vous mettre sur la voie. A vous de découvrir maintenant plus en détail les possibilités de ces outils.

Ils m'ont permis de découvrir plusieurs points d'optimisation et de réaliser des gains de performances significatifs dans mes développements.

Billet original sur Les RPM de Remi

 
 

dimanche, septembre 2 2007

English A small tutorial on using Memcached as a PHP session handler with php-pecl-memcache.

Français Un petit didacticiel sur l'utilisation de Memcached comme gestionnaire de sessions en PHP avec php-pecl-memcache.

Contexte

La plupart des applications développées en PHP utilisent les sessions pour stocker les informations qui doivent être conservées durant la navigation.

Lors de la mise en place de plusieurs serveurs (répartition de charge, tolérance de panne, etc) il est nécessaire de partager les sessions entre les différentes machines.

J'ai longtemps utilisé la solution triviale de rediriger les sessions vers un partage NFS.

Memcached est un service distribué gérant un cache d'objets en mémoire, très performant, générique par nature, mais particulièrement bien adapté à l'accélération des applications web. Nous allons voir comment l'utiliser comme gestionnaire pour les sessions PHP.

Installer le service memcached

Sur quelle machine monter le service ? La machine doit être disponible pour l'application, une solution consiste à la mettre sur la même machine que le serveur de bases de données, lui aussi indispensable à l'application (je ne connais pas beaucoup d'application sans base de données).

Le service est peu consommateur de charge processeur, mais peut nécessiter une grande quantité de mémoire.

Installation :

yum install memcached

Configuration :

Les options sont enregistrées dans le fichier /etc/sysconfig/memcached :

PORT="11211" USER="nobody" MAXCONN="1024" CACHESIZE="64" OPTIONS=""

Il pourra être utile d'augmenter la taille du cache, définie par défaut à 64 Mo.

Sécurité : ce service n'est pas sécurisé, on ne l'utilisera donc pas sur une machine connectée à internet sans protéger son port d'écoute par une règle de parefeu. Dans le cas d'un serveur disposant de plusieurs adresses IP, il est possible de préciser sur quelle adresse écouter en ajoutant l'option -l.

Activation :

chkconfig memcached on service memcached start

Installer le gestionnaire de session

Le client PHP est disponible en tant qu'extension PECL (voir memcache) qui depuis la version 2.1.0 fournit aussi un gestionnaire de sessions.

Le paquet est disponible pour Fedora, RHEL et CentOS dans les dépôts officiels et ici (voir : php-pecl-memcache).

Installation :

yum install php-pecl-memcache

Configuration :

Les options sont prévues (commentées) dans le fichier /etc/php.d/memcache.ini. Il suffit de les décommenter et de les adapter :

; Use memcache as a session handler session.save_handler=memcache ; Defines a comma separated of server urls to use for session storage session.save_path="tcp://localhost:11211?persistent=1&weight=1&timeout=1&retry_interval=15"

Activation :

Il suffit ensuite de relancer le serveur Apache afin de prendre en compte l'extension et sa configuration :

service httpd restart

Les informations retournées dans les informations PHP permettent de vérifier la configuration :

# php -m | grep memcache memcache # php -i | grep -i session Session Support => enabled ... session.save_handler => memcache session.save_path => tcp://localhost:11211?persistent=1&weight=1&timeout=1&retry_interval=15 ...

Conclusion

J'espère que ce petit didacticiel vous aura donner envie d'essayer ce gestionnaire de sessions alternatif. Et comme toujours, vos commentaires sont les bienvenus.

Billet original sur Les RPM de Remi

 
 

lundi, janvier 22 2007

English A short guide to build RPM of new Oracle Instant Client version 10.2.0.3 on x86_64 as they are not availaible on the official Oracle web site.

Français Un petit guide pour construire les RPM du nouveau Oracle Instant Client version 10.2.0.3 puiqu'ils ne sont pas disponibles sur le site officiel d'Oracle.

L'installation de Oracle Instant Client est certainement la solution la plus simple de disposer d'un accès aux bases Oracle depuis un client Unix/Linux/Windows/MacOS. Oracle fourni directement les RPM (utilisables sous Fedora) pour certaines versions et uniquement pour i386. Pour les autres versions, seules les archives aux formats ZIP sont disponibles sur le site.

L'autre solution consiste à utiliser le Oracle Database 10g Express Client. Lui aussi n'est disponible qu'en version 10.2.0.1 et i386.

Bien sur l'idéal serait que je puisse mettre les RPM sur mon dépôt, cependant, la licence d'utilisation ne me le permet sans doute pas.

Voici donc une petit guide, que j'espère trés simple, qui vous permettra de les construire vous même.

Préparez un environnement de construction

Faut-il encore rappeler que les RPM ne doit jamais être construit sous le compte administrateur ?

Tutorial : RPM : environnement de construction

Téléchargez les archives depuis le site officiel

Adresse : http://www.oracle.com/technology/tech/oci/instantclient/instantclient.html

Récupérez et enregistrez dans votre dossier SOURCES:

  • instantclient-basic-linux-x86-64-10.2.0.3-20070103.zip (34,8 Mo)
  • instantclient-jdbc-linux-x86-64-10.2.0.3-20070103.zip (1,4 Mo)
  • instantclient-sqlplus-linux-x86-64-10.2.0.3-20070103.zip (0,8 Mo)
  • instantclient-sdk-linux-x86-64-10.2.0.3-20070103.zip (0,6 Mo)
  • instantclient-odbc-linux-x86-64-10.2.0.3-20070103.zip (0,3 Mo)

N.B. pour les versions 32 bits, il faut prendre les instantclient-*-linux32-10.2.0.3-20061115.zip

Installez les soures du RPM

Enregistrez le fichier oracle-instantclient-10.2.0.3-1.fc6.remi.nosrc.rpm dans un dossier et installez le :

rpm -ivh oracle-instantclient-10.2.0.3-1.fc6.remi.nosrc.rpm

Le fichier oracle-instantclient.spec sera enregistré dans votre dossier SPEC.

Les directives de construction du RPM suivent la même stratégie qu'Oracle dans les anciennes versions , c'est à dire que les entêtes (fichiers .h) sont enregistrées dans le dossier /usr/include/oracle/10.2.0.3/client et les bibliothèques dans le dossier /usr/lib64/oracle/10.2.0.3/client/lib. Par contre la configuration de l'éditeur de lien dynamique est modifiée pour trouver ces bibliothèques.

Lancez la construction

Depuis votre dossier SPEC :

rpmbuild -bb oracle-instantclient.spec

Vous devez obtenir les RPM attendus dans le dossier RPMS/x86_64:

  • oracle-instantclient-basic-10.2.0.3-1.fc6.remi.x86_64.rpm
  • oracle-instantclient-devel-10.2.0.3-1.fc6.remi.x86_64.rpm
  • oracle-instantclient-jdbc-10.2.0.3-1.fc6.remi.x86_64.rpm
  • oracle-instantclient-odbc-10.2.0.3-1.fc6.remi.x86_64.rpm
  • oracle-instantclient-sqlplus-10.2.0.3-1.fc6.remi.x86_64.rpm

Installez et utilisez vos RPM

Vous pouvez maintenant les installer et les utiliser. Par exemple pour avoir Accès aux bases de données Oracle en PHP

Comme toujours n'hésitez pas à me faire part de vos remarques.

Billet original sur Les RPM de Remi

 
 

dimanche, novembre 12 2006

English Running Flash and Acrobat Reader plugins (32 bits version) on x86_64 arch is possible using the nspluginwrapper.

Français Il est possible d'utiliser les extensions Flash et Acrobat Reader (version 32 bits) sur une architecture x86_64 en utilisant nspluginwrapper.

Installation de nspluginwrapper

Télécharger les RPM disponibles sur le Site officiel

  • Le plugin : nspluginwrapper-0.9.90.3-1.x86_64.rpm
  • Le visionneur : nspluginwrapper-i386-0.9.90.3-1.x86_64.rpm

Installer les extensions :

yum install nspluginwrapper-0.9.90.3-1.x86_64.rpm nspluginwrapper-i386-0.9.90.3-1.x86_64.rpm

Créer le répertoire des extensions 32 bits standard.

mkdir -p /usr/lib/mozilla/plugins

Installation du Flash Player 9

Télécharger la version Béta depuis le site Adobe Labs

  • Version à installer : FP9_plugin_beta_101806.tar.gz

Installer l'extension :

tar xzf FP9_plugin_beta_101806.tar.gz cp flash-player-plugin-9.0.21.55/libflashplayer.so /usr/lib/mozilla/plugins

Installation de Acrobat Reader

Télécharger la dernière version depuis le site http://www.adobe.com/

Installer le RPM :

yum install AdobeReader_fra-7.0.8-1.i386.rpm

Ne pas oublier d'appliquer le correctif pour Acrobat Reader 7.0.8 et Fedora Core 6

Installer l'extension :

/usr/local/Adobe/Acrobat7.0/Browser/install_browser_plugin

Installation manuelle, globale dans le répertoire /usr/lib/mozilla.

Configuration des extensions

Demander à nspluginwrapper d'installer les extensions

nspluginwrapper -i /usr/lib/mozilla/plugins/nppdf.so nspluginwrapper -i /usr/lib/mozilla/plugins/libflashplayer.so

Contrôler :

nspluginwrapper -l /usr/lib64/mozilla/plugins/npwrapper.nppdf.so Original plugin: /usr/lib/mozilla/plugins/nppdf.so Wrapper version string: 0.9.90.3 /usr/lib64/mozilla/plugins/npwrapper.libflashplayer.so Original plugin: /usr/lib/mozilla/plugins/libflashplayer.so Wrapper version string: 0.9.90.3

Naviguer

Relancer votre firefox version x86_64, dans la liste des extensions (about:plugins) vous devez trouvez les nouvelles extensions

  • Shockwave Flash
    • Nom de fichier : npwrapper.libflashplayer.so
    • Shockwave Flash 9.0 d55
  • Adobe Reader 7.0
    • Nom de fichier : npwrapper.nppdf.so
    • The Adobe Reader plugin is used to enable viewing of PDF and FDF files from within the browser.

Tuto testé avec Firefox 2.0

Comme toujours, les commentaires sont ouverts.

Billet original sur Les RPM de Remi