samedi 31 mars 2012

[Bash] Gestion de processus asynchrones

Lors d'une de mes formations "Unix et Programmation Shell", je me suis retrouvé devant une problématique d'un de mes élèves que je n'avais jamais rencontré auparavant. En effet son soucis était de pouvoir gérer correctement au sein d'un processus général le lancement de 4 processus en parallèle n'ayant pas les même temps d’exécution et de pouvoir continuer la suite de l’exécution générale tout en étant sûr que les 4 processus se soient terminés.

Je m'explique :
Soit le processus global contenant 4 processus indépendants :
- soit le processus 1 devant s’exécuter pendant 20 secondes
- soit le processus 2 devant s’exécuter pendant 30 secondes
- soit le processus 3 devant s’exécuter pendant 40 secondes
- soit le processus 4 devant s’exécuter pendant 10 secondes
Ces 4 processus sont lancés en même temps, et du fait que chaque processus ne va pas se terminer au même moment, il faut attendre que chaque script soit terminé pour continuer la suite d'un processus global

Pour résoudre ce problème, je vais créer un script qui va simuler ce temps d’exécution soit :

[ time.sh ]
#!/bin/bash
# JN - 2012
# script de simulation
# $1 : numéro du travail
# $2 : nombre d'itérations à effectuer (correspond à la durée d'exécution du processus secondes)

# Exemple : sh time.sh 2 30 - création du processus 2 pendant 30 secondes

i=0
touch Z$1
while [ $i -lt $2 ]
do
   echo `date` >> Z$1
   i=`expr $i + 1`
   sleep 1
done
echo $1" terminé !"

exit 0


Exécution des 4 processus en parallèle :

sh time.sh 1 20 & sh time.sh 2 30 & sh time.sh 3 40 & sh time.sh 4 10

NB : ces processus créént 4 fichiers Z1, Z2, Z3, Z4.
Pour ce faire nous allons utiliser à la fois la récupération des processus (PID) lancés en arrière plan soit la variable $! et la commande wait

Processus global :

[ global.sh ]
#!/bin/bash
# script global

# exécution des 4 processus 
sh time.sh 1 20 & var1="$!" & sh time.sh 2 10 & var2="$!" & sh time.sh 3 40 & var3="$!" & sh time.sh 4 30 & var4="$!"

# gestion de la synchronicité des processus
wait $var1 && wait $var2 && wait $var3 && wait $var4

# suite du processus général
echo "Tous les processus sont terminés ;) "


En ouvrant par exemple 4 fenêtres d'invite de commande pour  voir le déroulement des 4 processus (soit en utilisant par exemple la commande tail -f Z1, tail -f Z2, etc... ), et en lançant le processus général dans une 5ème fenêtre soit :


sh global.sh


 on obtient :




well done !!! ;)


Outil de capture vidéo utilisé :
http://doc.ubuntu-fr.org/capture



lundi 12 mars 2012

[OpenERP-PHP] XML-RPC

Objet : Faire communiquer une plateforme PHP et un serveur OpenERP via XML-RPC

OpenERP : http://www.openerp.com/downloads

XML-RPC ? http://xmlrpc.scripting.com/spec.html

XML-RPC pour PHP ? est une extension php, accessible depuis PHP 4
pour l'activer ;extension=php_xmlrpc.dll dans le php.ini
La doc se situe ici : http://phpxmlrpc.sourceforge.net/doc-2/

OpenERP && XML-RPC ? http://doc.openerp.com/v6.0/developer/6_22_XML-RPC_web_services/index.html

Ce post permet de rassembler les points importants et de synthétiser l'utilisation que j'ai faite de  XML-RPC au travers de la communication avec une plateforme OpenERP.

[à venir]





dimanche 4 mars 2012

php 5.3 + Apache 2.2 VS php 5.4 + Apache 2.4

Environnement de test :
Dell XPS 15z L511
i7-2640M
8 192Mo DDR3
SSD 256Go

Ubuntu 11.10
Apache 2.2.20
PHP 5.3.10


Installation Apache 2.4.2 et PHP 5.4.1

sudo su -
cd /usr/local/


Installer quelques librairies
apt-get install libedit-dev libtidy-dev libxslt1-dev libmcrypt-dev libcurl4-gnutls-dev libaprutil1-dev


Installer Apache 2.4.2
wget http://apache.petsads.us//httpd/httpd-2.4.2.tar.gz 
# [edit - 25/04/12] version 2.4.2
tar -xvzf httpd-2.4.2.tar.gz 
cd httpd-2.4.2 
./configure --enable-file-cache --enable-cache --enable-disk-cache --enable-mem-cache --enable-deflate --enable-expires --enable-headers --enable-usertrack --enable-ssl --enable-cgi --enable-vhost-alias --enable-rewrite --enable-so   
make 
make install

Installer PHP 5.4.1

cd .. 
wget http://downloads.php.net/stas/php-5.4.1.tar.gz
# [edit - 25/04/12] version 5.4.1
tar -xvzf php-5.4.1.tar.gz 
cd php-5.4.1 
'./configure' '--disable-debug' '--enable-inline-optimization' '--disable-all' '--enable-libxml' '--enable-session' '--enable-xml' '--enable-hash' '--with-pear' '--with-apxs2=/usr/local/apache2/bin/apxs' '--with-layout=GNU' '--enable-filter' '--with-pcre-regex' '--with-zlib' '--enable-simplexml' '--enable-xmlwriter' '--enable-dom' '--with-openssl' '--enable-pdo' '--with-pdo-sqlite' '--with-readline' '--with-sqlite3' '--with-iconv' '--disable-phar' '--with-libedit' '--enable-exif' '--with-bz2' '--with-gettext' '--with-mcrypt' '--with-mhash' '--with-gd' '--with-jpeg-dir' '--with-png-dir' '--with-zlib-dir' '--with-xsl' '--with-tidy' '--with-freetype-dir' '--enable-gd-native-ttf' '--enable-mbstring' '--enable-sockets' '--enable-dom' '--enable-xml' '--enable-soap' '--enable-libxml' '--enable-session' '--enable-simplexml' --with-kerberos --with-curl '--with-mysql-sock' '--with-mysql=mysqlnd' '--with-mysqli=mysqlnd' '--with-pdo-mysql=mysqlnd' '--with-config-file-path=/usr/local/etc' '--with-libdir=lib64'
make 
make install
cp php.ini-development /usr/local/etc/php.ini

Puis :
 gedit /usr/local/apache2/conf/httpd.conf
Modification du port d'écoute d'Apache :
Listen 88
et du répertoire de travail :
DocumentRoot "/var/www"
et rajouter également (dans certain cas) :

<filesmatch "\.phps$"="">
    SetHandler application/x-httpd-php-source
</filesmatch>


Redémarrage d'Apache : /usr/local/apache2/bin/apachectl restart

Nous allons testé à la fois PHP5.3 + Apache2.2 sur  http://localhost
et PHP5.4 + Apache2.4 sur
http://localhost:88


Tester avec l'affichage d'un petit phpinfo() dans chaque cas et en avant !


php 5.4.1 + Apache 2.4.2 sur localhost:88
php 5.4.1 + Apache 2.4.2 sur localhost:88

php 5.3.1 + Apache 2.2.22 sur localhost:80
php 5.3.1 + Apache 2.2.22 sur localhost:80




cf. 
Marche à suivre officielle pour l'install d'Apache et php :
http://www.php.net/manual/fr/install.unix.apache2.php
Différents messages d'erreur que l'on peut trouver lors des compilations :
http://www.litespeedtech.com/support/wiki/doku.php?id=litespeed_wiki:php:lsapi:troubleshoot




1/ Bench#1 - http://phpbench.net/ :

cd /var/www/
wget http://phpbench.net/download/0.1.0/phpbench.php

tester :  http://localhost/phpbench.php 
Résultats :

Test #1 54 ms
Test #2 64 ms
Test #3 52 ms
Test #4 64 ms
Test #5 60 ms
Average of all 5 times: 59 ms

puis http://localhost:88/phpbench.php 
Résultats :

Test #1 47 ms
Test #2 54 ms
Test #3 48 ms
Test #4 50 ms
Test #5 47 ms
Average of all 5 times: 49 ms

le test a été réalisé 5 fois de suite et on note un gain d'environ 20% en faveur du couple PHP5.4 + Apache 2.4.

2/ Bench#2 - http://php-benchmark-script.com/ :

wget http://php-benchmark-script.com/bench.zip
unzip bench.zip


tester :  http://localhost/bench.php 
Résultats :
--------------------------------------
|        PHP BENCHMARK SCRIPT        |
--------------------------------------
Start : 2012-03-04 18:27:31
Server : localhost@127.0.0.1
PHP version : 5.3.10-1~dotdeb.1
Platform : Linux
--------------------------------------
test_math                 : 1.618 sec.
test_stringmanipulation   : 1.554 sec.
test_loops                : 1.046 sec.
test_ifelse               : 0.758 sec.
--------------------------------------
Total time:               : 4.976 sec.

puis http://localhost:88/bench.php 
Résultats :
--------------------------------------
|        PHP BENCHMARK SCRIPT        |
--------------------------------------
Start : 2012-03-04 17:27:15
Server : localhost@127.0.0.1
PHP version : 5.4.0
Platform : Linux
--------------------------------------
test_math                 : 1.492 sec.
test_stringmanipulation   : 1.484 sec.
test_loops                : 0.689 sec.
test_ifelse               : 0.574 sec.
--------------------------------------
Total time:               : 4.239 sec.

le test a été réalisé 5 fois de suite et on note un gain d'environ 15% en faveur du couple PHP5.4 + Apache 2.4.


3/ Bench#3 - http://www.free-webhosts.com/php-hosting-comparison.php

Aller sur http://www.free-webhosts.com/php-benchmark-script.php et récupérer le script.

tester :  http://localhost/php-benchmark.php 
Résultats :

Test #1 completed in 28 ms. 
Test #2 completed in 29 ms.
 Test #3 completed in 41 ms. 
Test #4 completed in 26 ms. 
Test #5 completed in 38 ms. 
Test #6 completed in 29 ms. 
Test #7 completed in 33 ms. 
Test #8 completed in 26 ms. 
Test #9 completed in 22 ms. 
Test #10 completed in 29 ms. 
Test #11 completed in 26 ms. 
Test #12 completed in 36 ms. 
 Lowest time: 22 ms , Highest time : 41 ms 
Average of all 12 times: 30 ms 
Average of middle 10 times: 30 ms

puis http://localhost:88/php-benchmark.php 
Résultats :

Test #1 completed in 30 ms. 
Test #2 completed in 33 ms. 
Test #3 completed in 28 ms. 
Test #4 completed in 25 ms. 
Test #5 completed in 26 ms. 
Test #6 completed in 33 ms. 
Test #7 completed in 29 ms. 
Test #8 completed in 24 ms. 
Test #9 completed in 34 ms. 
Test #10 completed in 26 ms. 
Test #11 completed in 30 ms. 
Test #12 completed in 29 ms. 
 Lowest time: 24 ms , Highest time : 34 ms 
Average of all 12 times: 29 ms 
Average of middle 10 times: 29 ms

le test montre une différence de performance assez négligeable...


[edit du 25/04/12] - ajout de quelques précisions