convertir un array en utf8
dans un précédent article nous avons vu comment convertir un texte en utf8.
aujourd'hui on va voir comment faire la même chose mais avec un tableau, sans passer par un foreach, ni aucune autre boucle.
pour cela nous allons utiliser une seule fonction qui convertira ce qu'on lui donne en entrée en utf8.
pour l'instant elle va savoir gérer, les chaînes de caractères et les tableaux.
function toUTF8($param) { if(is_array($param)) { array_walk_recursive($param, create_function('&$item, $index', '$item = toUTF8($item);')); return $param; } mb_detect_order('UTF-8, ISO-8859-15, ISO-8859-1, Windows-1252'); //parfois si le dernier caractère de la chaine est accentué, la conversion peut foirer, //donc on force avec un caractère qui ne l'est pas. //(astuce trouvée sur les commentaires de la doc sur php.net) $param .= '_'; $currentCharset = mb_detect_encoding($param); if ($currentCharset != 'UTF-8') { $param = mb_convert_encoding($param, 'UTF-8', $currentCharset); } return substr($param, 0, strlen($param)-1); } |
et voilà, cette fonction convertira array ou string en utf8 sans brancher...
en bonus voici une fonction somme que j'ai trouvé dans les commentaire de la doc sur php.net (une sorte de coup de coeur pour moi
)
function sum(){ $s=0; foreach(func_get_args() as $a) $s+= is_numeric($a)?$a:0; return $s; }; print sum(1,2,3,4,5,6); // will return 21 print sum(3,2,1); // will return 6 print sum(false,array(),5,5); // will return 10 |
trop fort non ?
Lighttpd vs Apache vs Lighttpd + Apache
Il fut un temps où on ne se posait pas de question quant au serveur web, on prend Apache et on en parle plus, aujourd'hui les choses ont changé, Apache reste quand même le plus utilisé avec plus de 66% des parts de marché, suivi par IIS, puis tous les autres "petits" derrière, néanmoins en fonction des besoins, certains de ces petits peuvent s'avérer bien plus performants qu'Apache, aujourd'hui on va tester 3 configurations possibles avec Apache et Lighttpd.
d'après ce qu'on peut lire un peu partout sur le net, Lighttpd (lighty pour les intimes) est beaucoup plus performant quand il s'agit de servir des pages statiques, mais qu'en est-il vraiment ? et comment s'en sort-il avec le contenu dynamique ? (des sites statiques ça n'existe plus de nos jours ^^).
pour notre test, on va prendre un site très léger, basé sur Zend framework (donc loin d'être statique), contenant une page qui affiche 9 images au hasard a partir d'une tables mysql contenant environ 1000 enregistrements (seulement les emplacement des images sont stockés dans la base). Le serveur de test est un kimsufi L (petit processeur et 1Go de RAM).
versions utilisées :
Apache 2.2.9
Lighttpd 1.4.19
PHP 5.2.6
pour les tests on utilise siege, on lance donc un siege avec 100 concurrency sur 10 minutes, voici la commande :
siege -c100 -t10M URL_DU_SITE |
on note également le Load average de la machine a la fin de l'opération.
1ère configuration : Lighttpd tout seul
voici le resultat :
Load average : 4.87 Lifting the server siege... done. Transactions: 23859 hits Availability: 100.00 % Elapsed time: 600.37 secs Data transferred: 83.25 MB Response time: 2.02 secs Transaction rate: 39.74 trans/sec Throughput: 0.14 MB/sec Concurrency: 80.21 Successful transactions: 23859 Failed transactions: 0 Longest transaction: 5.20 Shortest transaction: 0.10 |
2ème configuration : Apache2 tout seul
le résultat :
Load average : 77.51 Lifting the server siege... done. Transactions: 23543 hits Availability: 100.00 % Elapsed time: 599.66 secs Data transferred: 82.16 MB Response time: 2.04 secs Transaction rate: 39.26 trans/sec Throughput: 0.14 MB/sec Concurrency: 80.22 Successful transactions: 23543 Failed transactions: 0 Longest transaction: 10.51 Shortest transaction: 0.05 |
3ème configuration : Lighttpd + Apache
maintenant faisons le test en couplant les 2, dans cette configuration tout ce qui est statique (images, css, js, etc.) sera servi par lighty alors que les scripts php eux, seront traités par apache, pour cela on active le mod_proxy dans lighty, et on ajoute le code suivant dans le vhost de notre site :
$HTTP["url"] !~ "\.(js|css|gif|jpg|png|ico|txt|swf|html|htm)$" { proxy.server = ( "" => ( ( "host" => "127.0.0.1", "port" => 8080 ) ) ) } |
vous l'aurez compris, Apache écoute sur le port 8080 (c'est fait en changeant le fichier /etc/apache2/ports.conf).
voici le résultat :
Load average : 14.79 Lifting the server siege... done. Transactions: 22684 hits Availability: 100.00 % Elapsed time: 600.25 secs Data transferred: 79.10 MB Response time: 2.13 secs Transaction rate: 37.79 trans/sec Throughput: 0.13 MB/sec Concurrency: 80.53 Successful transactions: 22684 Failed transactions: 0 Longest transaction: 8.61 Shortest transaction: 0.07 |
plutôt surprenant !
Conclusion :
Lighty s'en sort très bien au vu des transactions/s (ou le nombre total de transactions traitées), contrairement a ce qu'on pouvait attendre, coupler les 2 nous fait perdre en performances (on enregistre quand même un load average nettement inférieur a la config d'apache tout seul).
personnellement ce que je retiens, c'est que lighty n'est pas si mauvais que ça pour le contenu dynamique, les performances restent quand très proches dans les 3 cas, donc autant utiliser la solution qui nous plait
Installer libssh2, ssh2 pour php
Dans cet article nous allons voir comment installer l'extension ssh2 pour php5, cette extension permet l'utilisation de fonctionnalités SSH2 avec php (très utiles quand on veut faire du SFTP par exemple) pour plus d'informations cf. la documentation officielle sur php.net
Pour l'installation, ce n'est pas très compliqué, il suffit de suivre ces quelques étapes à la lettre et tout ira très bien
tout d'abord il faut s'assurer d'avoir les bons paquets d'installés, en voici une liste :
- php5-dev
- openssl
- libssl-dev
- gcc
- make
- etc. je suppose que si vous installez cette extension, c'est que vous avez déjà php, apache etc.
Toute la suite s'effectue en root
mais avant toute chose, n'oublions pas de faire un petit :
apt-get update apt-get upgrade |
en suite il faut créer un répertoire de travail :
cd ~ mkdir libssh2 cd libssh2 |
ensuite télécharger libssh2 :
wget http://ovh.dl.sourceforge.net/sourceforge/libssh2/libssh2-0.14.tar.gz |
puis l'extraire :
tar -xzvf libssh2-0.14.tar.gz |
aller dans le répertoire créé et installer libssh2 :
cd libssh2-0.14 ./configure && make all install |
maintenant que libssh2 est installée, passons a ssh2 :
on sort du repertoire de libssh2 et on télécharge ssh2 :
cd .. wget http://pecl.php.net/get/ssh2-0.10.tgz |
extraire l'archive téléchargée :
tar -xzvf ssh2-0.10.tgz |
aller dans le répertoire créé et installer ssh2 :
cd ssh2-0.10 phpize && ./configure --with-ssh2 && make |
maintenant que l'installation est terminée, on active l'extension, ici on va copier le fichier ssh2.so dans le répertoire des extension de php5 (il peut être différent du mien selon la distrib et l'installation) :
cp modules/ssh2.so /usr/lib/php5/20060613+lfs |
puis on ajoute l'extension en créant un fichier ssh2.ini dans le répertoire conf.d (comme pour toutes les autres extensions de php) on n'oublie pas de le faire pour apache mais aussi pour le mode CLI.
echo "extension=ssh2.so" > /etc/php5/cli/conf.d/ssh2.ini echo "extension=ssh2.so" > /etc/php5/apache2/conf.d/ssh2.ini /etc/init.d/apache2 restart |
Et voilà, notre extension est installée, a vous ssh2 et sftp avec php
Comment installer fileinfo sous debian
Les fonctions de l'extension FileInfo essaient de savoir le type de contenu et l’encodage d’un fichier en regardant certaines séquences d’octet "magique" à des positions spécifiques à l’intérieur du fichier. Bien qu'il ne s'agit pas d'une approche infaillible, la méthode heuristique effectue un très bon travail.
le problème avec cette extension c'est qu'elle est un peu dur à installer, en réalité pas si dur que ça, il suffit de prendre le temps de le faire. Il faut juste savoir qu'un simple apt-get install php5-fileinfo ne suffira pas, tout simplement parce qu'il n'existe pas de paquet debian pour cette extension (pas encore...).
Donc pour l'installer, voici la procédure :
Il faut d'abord installer PEAR :
apt-get install php-pear |
ensuite il faut installer php5-dev si ce n'est pas déjà fait, ceci installera phpize ce qui nous évitera l'erreur :
sh: phpize: command not found ERROR: `phpize' failed |
installation de php5-dev :
apt-get install php5-dev |
c'est presque bon mais pas encore :
maintenant il faut installer libmagic pour nous éviter une erreur lors de l'installation de fileinfo :
apt-get install libmagic-dev |
maintenant tout est bon, nous allons enfin pouvoir lancer l'installation de notre extension :
pecl install fileinfo |
Voilà, maintenant fileinfo est installée, nous allons pouvoir vérifier les types mime des fichiers avec des méthodes plus fiables
Normalement tout devrait fonctionner maintenant, mais il ce peut que l'extension ne soit pas activée comme il faut, dans ce cas il faudra créer un fichier fileinfo.ini dans /etc/php5/apache2/conf.d avec le contenu suivant :
extension=fileinfo.so |
reloader apache avec /etc/init.d/apache2 reload et le tour est joué
Installer PHPDoc et générer une documentation
Dans cet article nous allons voir comment à partir d'un code source bien commenté, générer une documentation comme on aimerait avoir pour tout projet ou application digne de son nom.
Pour cela nous allons utiliser PHPDocumentor. qui va nous permetre de générer une documentation à paritr des sources de notre projet.
Il faut d'abord l'installer avec la commande suivante :
pear install phpdocumentor |
(si pear n'est pas installé faites un apt-get install php-pear)
Si vous rencontrez un problème de dépassement de mémoire alouée avec PHP, allez dans /etc/php5/cli/php.ini et augmenter cette limite (il s'agit du paramètre memory_limit).
création d'un fichier de configuration pour le projet :
pour générer la documentation d'un projet nous avons besoin d'un fichier de configuration par projet, en voici un exemple :
fichier nom_du_projet.conf :
[Parse Data] title = Titre de la documentation hidden = false parseprivate = off javadocdesc = off defaultcategoryname = Documentation defaultpackagename = Projet target = /PATH/OU/SERA/ENREGISTRE/LA/DOCUMENTATION readmeinstallchangelog = README, INSTALL, FAQ, LICENSE directory = /PATH/VERS/LE/PROJET ignore = templates/,test*.php sourcecode = on output=HTML:frames:earthli |
et pour tester exécutez la commande suivante (après avoir créé le répertoire cible de la documentation)
phpdoc -c nom_du_projet.conf |
et voilà, la génération prend un peu de temps, en fonction de la machine et de la taille du projet.