Catégorie : PHP.

PHP : Donner du style à print_r et var_dump !

Quel développeur PHP n’a jamais utilisé les fonctions print_r et var_dump ? Mais le problème avec ces fonctions c’est que dès que l’on affiche des objets/tableaux/etc… super longs on se retrouve avec un affichage qui donne parfois envie de se jeter par la fenêtre (pas Windows, hein !) la tête la première. Est-ce que présentée de la façon ci-dessous, un objet ne vous donnerait-il pas moins de maux de tête ?

Pour vous aider dans vos phases de débogage, il existe un outil formidable qui s’appelle Krumo. Les développeurs Drupal qui ont déjà utilisé Devel et/ou Devel Themer connaissent forcément Krumo. En passant, je remercie un certain Thomas (il se reconnaitra sûrement) qui m’a fait découvrir les fonctions de Krumo et en creusant quelque peu je suis tombé sur le site du projet.

Il suffit juste d’inclure la fichier class.krumo.php, de paramétrer si besoin le fichier krumo.ini et de profiter de Krumo.

Krumo sur SourceForge.

Drupal 7 fait sa sortie.

Logo Drupal
Drupal est disponible en version 7 depuis le 5 janvier. Cette nouvelle version apporte moultes améliorations et nous retiendrons comme LinuxFR :

  • Un support unifié des moteurs de base de données. Contrairement à la version précédente, il existe maintenant une API commune pour accéder aux différentes bases ;
  • L’intégration du module CCK dans le cœur du logiciel afin de faciliter la personnalisation des contenus. Ces données peuvent être stockées dans la base de données SQL ou dans une base NoSQL ;
  • Le module RDF permet de s’inscrire dans le web sémantique ;
  • La gestion des images est désormais pleinement intégrée à Drupal avec la gestion des miniatures ou des prévisualisations ;
  • Les modes de téléchargements de fichiers public (géré par le serveur HTTP) et privé (géré par Drupal, ce qui permet de gérer les droits plus finement) peuvent désormais être actifs en même temps.

Pour avoir testé la bête depuis les versions beta, je dois vous avouer que j’ai été agréablement surpris par la nouvelle interface d’administration. Tous ceux qui ont testé Drupal 6 savent que l’administration de cette version pouvait parfois être un casse tête. Drupal 7 a vraiment fait une bond de ce côté. De plus l’intégration par défaut des modules susnommés ne sont pas pour me déplaire comme le fameux CCK.

Pour ma part il n’est pas encore question de l’utiliser en production car il me faut d’abord plus de temps pour l’apprivoiser mais aussi car le nombre de modules pour Drupal 7 (environ 900 au moment où j’écris ces lignes) n’a rien a voir avoir la quantité de modules Drupal 6 (plus de 5100). De plus il ne faut pas oublier que beaucoup de ces modules Drupal sont encore en version beta quand ils ne sont pas en version alpha. Mais ne vous inquiétez pas, la communauté Drupal travaille très vite à l’image du célèbre module WYSIWYG qui était disponible en version beta mercredi et qui est version finale aujourd’hui.

Ubuntu : installer uploadprogress via PECL.

uploadprogress est une bibliothèque PEAR, donc PHP, qui permet de suivre la progression d’un téléversement (upload) de fichier. C’est une bibliothèque utile à Drupal 6 par exemple. Et c’est dans la cadre de ce CMS que j’ai été amené à connaître cette bibliothèque et à en faire l’installation sur une Ubuntu.

Pour installer uploadprogress il faut utiliser la commande pecl. Pour ce faire il faut que les paquets php5-dev et php-pear soient installés. Si ce n’est pas le cas :

sudo apt-get install php5-dev php-pear

Maintenant on s’occupe d’installer uploadprogress :

sudo pecl install uploadprogress

Ensuite on ajoute cette ligne au fichier /etc/php5/apache2/php.ini :

extension=uploadprogress.so

Enfin on redémarre Apache :

sudo /etc/init.d/apache2 restart

Voilà c’est tout pour ce tuto, et n’oubliez surtout pas : BI-DOU-ILLEZ !

Internationalisation : PHP, gettext et Ubuntu.

Drapeaux

Gettext et PHP, en général ça part vite en eau de boudin car la plupart du temps gettext n’est pas bien installé. Le but de cet article donc est de vous montrer comment faire marcher gettext avec Ubuntu (si je ne me trompe pas la démarche est identique avec une distribution Debian).

Rappelons tout de même que gettext est une bibliothèque (library en anglais) d’internationalisation du Projet GNU, qu’elle n’est pas utilisée que dans le cadre de PHP et qu’elle est assez répandue.

Il y a deux parties à prendre en compte dans gettext : d’une part les fichiers d’internationalisation, d’autre part l’utilisation de gettext par PHP.

Les fichiers d’internationalisation.

La bibliothèque gettext utilise des fichiers en extension .mo compilés avec msgfmt à partir de fichiers en extension .po qui ont une structure du type :

msgid "Hello"
msgstr "Bonjour"

msgid "My name is %s."
msgstr "Je m'appelle %s."

Pour compiler vos fichiers .po en .mo, deux solutions s’offrent à vous : Poedit qui est un application graphique ou la ligne de commande avec msgfmt.

msgfmt -o fichier.mo fichier.po

Utilisation de gettext par PHP.

D’abord installer le paquet php-gettext :

sudo apt-get install php-gettext

Puis générer les locales qui vont être utilisées par la traduction. Sans cela vous ne pourrez pas utiliser gettext avec les fonctions natives de gettext, seules les fonctions gettext spécifiques à PHP fonctionneront. Personnellement je préfère les natives mais c’est un peu plus lourd à gérer, il est vrai. Ce sont ces fonctions natives que je vous présente dans ce tutoriel. Donc on génère quelques locales qui nous intéressent avec la commande locale-gen :

sudo locale-gen en_US
sudo locale-gen en_BR
sudo locale-gen fr_FR

Maintenant il faut structurer les fichiers d’internationalisation de façon spécifique : langueLC_MESSAGESfichier.mo. Il faut impérativement les placer dans un sous-dossier LC_MESSAGES. Un exemple de comment les structurer :

Structure fichiers d'internationalisation

Ensuite dans le script PHP du site on insère le code suivant à adapter selon la structure de celui-ci bien évidemment :

$locale = "fr_FR";
$fichier_mo = "messages"; // Fichier d'internationalisation compilé sans l'extension.
$folder_lang = "./lang"; // Dossier ou se trouver les dossiers de langues (en_US, fr_FR).
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
bindtextdomain($fichier_mo, $folder_lang);
textdomain($fichier_mo);
print gettext("Hello"); // Sans variable
printf(_("My name is %s."), "Brian"); // Avec une variable

Je tiens à préciser que _() est un alias de la fonction gettext() et que les deux lignes suivantes vous donneront le même résultat :

print gettext("Hello");
print _("Hello");

Voilà c’est tout pour ce tuto, et n’oubliez surtout pas : BI-DOU-ILLEZ !

PHP : Chaîne et réécriture d’URL.

Chaîne de l'Himalaya

Bon on en trouve pas mal de fonctions sur la toile qui permettent de transformer une chaîne de caractères dans un format adapté à la réécriture d’URL, URL rewriting en anglais pour ceux qui arrivent à le prononcer avec l’accent. Mais celle que je vais vous présenter emploie les expressions régulières et des fonctions qui prennent en compte l’UTF-8.

La fonction

function url_rewriting($str) {
  $str = str_replace('&', 'et', $str);

  // On convertit la chaîne en UTF-8 si besoin est.
  if($str !== mb_convert_encoding(mb_convert_encoding($str,'UTF-32','UTF-8'),'UTF-8','UTF-32')) {
      $str = mb_convert_encoding($str,'UTF-8');
    }

  $str = htmlentities($str, ENT_NOQUOTES ,'UTF-8');

  // Quelques entités à remplacer par les lettres correspondantes.
  $str = preg_replace('`&([a-z]{1,2})(acute|uml|circ|grave|ring|cedil|slash|tilde|caron|lig);`i','$1',$str);

  $str = preg_replace(array('`[^a-z0-9]`i','`[-]+`'),'-',$str);
  return strtolower(trim($str,'-'));
}

Bon pour ceux qui n’auraient pas compris, l’Image c’est l’Himalaya… Une chaîne… De montagnes ! Bon ben… Voilà c’est tout pour ce tuto, et n’oubliez surtout pas : BI-DOU-ILLEZ !

Source : Image.

Ma configuration LAMP et phpMyAdmin.

Logos des différents composants de LAMP.

Aujourd’hui je vais vous présenter l’installation de LAMP + phpMyAdmin que j’utilise au quotidien sur ma distribution Ubuntu. Dans un premier temps on va voir comment installer tout ce petit monde, puis dans un second temps je vous présenterai ma configuration.

Installer LAMP et phpMyAdmin

Normalement si vous lisez cet article c’est que vous devez avoir au moins une vague idée de ce à quoi correspond l’acronyme LAMP mais un rappel ne fait jamais de mal : L = GNU/Linux, A = Apache, M = MySQL et P = PHP. Pour l’installation on va utiliser tasksel avec cette commande suivante :

sudo tasksel install lamp-server

Il devrait vous demander un mot de passe pour l’utilisateur root en MySQL, n’oubliez pas de le renseigner. Ensuite le tout est de savoir si phpMyAdmin est installé par tasksel. Dans mes souvenirs, je crois que sous Lucid Lynx c’est le cas mais de toute façon essayer ne peut pas faire de mal. Dans le pire des cas il vous dira que c’est déjà installé. Donc la commande c’est :

sudo apt-get install phpmyadmin

Autoriser le .htaccess et la réécriture d’URL

Pour pouvoir faire de la réécriture d’URL il vous faut activer le module correspondant. La commande qui va bien :

sudo a2enmod rewrite

Dans l’absolu il faudrait redémarrer ou relancer Apache tout de suite mais on va d’abord autoriser le .htaccess pour nos futurs hôtes virtuels. Dans le fichier /etc/apache2/sites-available/default, répérer les sections ‹Directory /› et ‹Directory /var/www/›. Dans celles-ci, remplacer AllowOverride None par AllowOverride All.

Maintenant on redémarre Apache avec la commande :

sudo /etc/init.d/apache2 restart

L’erreur : Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName

Cela peut parfois vous faire perdre le peu de cheveux que vous aviez sur le caillou donc c’est toujours bon à rajouter dans votre apache2.conf : on va signifier à Apache l’adresse ip du bouzin au cas où. Perso j’ai un faible pour Vim mais quelque soit l’éditeur que vous utilisez il faudra le faire en super-utilisateur avec sudo. On rajoute en fin du fichier /etc/apache2/apache2.conf ou dans le fichier /etc/apache2/httpd.conf (vide par défaut) la ligne suivante :

ServerName 127.0.0.1

Certains préféreront localhost à 127.0.0.1, personnellement je ne suis ni fâché avec les chiffres ni avec les adresse ip. En gros chacun « il fait comme il veut » à partir du moment où dans votre fichier /etc/hosts vous avez bien cette ligne :

127.0.0.1 localhost

Le fichier php.ini

On va maintenant personnaliser la configuration de PHP . Dans les sous parties-suivantes je vous mettrais les options à modifier dans le fichier /etc/php5/apache2/php.ini.

Le Safe Mode

Pour pouvoir utiliser la fonction shell_exec avant PHP 5.3, il faut mettre le Safe Mode à OFF. Mais attention lisez bien la documentation qui va avec.

safe_mode = Off

Mémoire maximale d’un script

Il s’agit de l’option memory_limit dont la valeur est la taille maximale de la mémoire allouée à un script. Pour ceux qui travaillent avec Drupal, il faut mettre une valeur assez importante : 64, 128 voire parfois plus si vous avez vraiment beaucoup de modules installés.

memory_limit = 128M

Le niveau d’affichage d’erreur

Par défaut, PHP affiche toutes les erreurs excepté les erreurs de type notice mais comme on est en développement on va tout afficher.

error_reporting = E_ALL | E_STRICT

Afficher les erreurs

En phase de développement on laisser à On mais ne pas oubliez de mettre à Off en phase de production. Les internautes n’ont que faire de savoir ce qui a posé des erreurs dans votre script. Donc en développement :

display_errors = On

La taille maximale des données envoyées avec POST

Cette valeur doit être supérieure que le taille maximale des fichiers en envoi (upload_max_filesize).

post_max_size = 128M

La taille maximale des fichiers en envoi

En local je me limite à 128 Mo, après à vous de voir selon vos besoins :

upload_max_filesize = 64M

Pour le reste des options, je laisse les valeurs par défaut.

Voilà c’est tout pour ce tuto, et n’oubliez surtout pas : BI-DOU-ILLEZ !

PHP : Tronquer un texte.

Image de ciseaux

Aujourd’hui je vous présente une petite fonction qui sert à tronquer un texte. Ça peut servir pour afficher un aperçu par exemple dans vos flux RSS ou encore pour ceux qui utilisent un blog où les articles sont tronqués à l’accueil. Bref pour ce que vous voulez… C’est une fonction que j’ai trouvé sur le net et que j’ai modifié pour ne pas découper les mots.

Paramètres

$text

Le texte à tronquer, ça c’était facile à deviner…

$count

Le nombre de caractères que l’on veut afficher.

$suffix

Une chaîne à afficher après le texte tronquer comme trois points de suspensions ou encore un lien vers la suite du contenu.

function xwords($text, $count, $suffix = "") {
  if (strlen($text) >= $count) {
    $text = substr($text, 0, $count);
    $space = strrpos($text, " ");
    if ($space) {
      $text = substr($text, 0, $space);
    }
  }
  return $text.$suffix;
}

Voilà c’est tout pour ce tuto, et n’oubliez surtout pas : BI-DOU-ILLEZ !

La fonction class_alias pour PHP < 5.3.0.

Logo PHP, http://static.php.net/www.php.net/images/php.gif, transformé en PNG.

Avant PHP 5.3.0, la fonction class_alias PHP n’existe pas mais il est possible de la créer soi-même. Pour ceux qui ne savent pas à quoi sert cette fonction, comme son nom l’indique elle permet de créer un alias pour une classe. J’ai trouvé cette fonction dans les notes de contribution de la doc PHP.

Mais quelle utilité ?

Vous avez une classe avec un nom super long, Class_Avec_Un_Nom_Super_Long par exemple, et vous en avez marre de devoir vous le coltiner à longueur de clavier… Et bien voilà à quoi sert cette fonction va vous permettre de l’appeler C par exemple.

Le code

On vérifie d’abord que la fonction n’est pas présente dans la version de PHP qu’on utilise moyennant un joli message d’erreur, d’où la structure conditionnelle… le if quoi ! ;-)

// La fonction à proprement parler :
if (!function_exists('class_alias')) {
  function class_alias($original, $alias) {
      eval('class ' . $alias . ' extends ' . $original . ' {}');
  }
}

// Exemple d'utilisation :
class_alias("Class_Avec_Un_Nom_Super_Long", "C");
// Au lieu de :
$class = new Class_Avec_Un_Nom_Super_Long();
// On peut maintenant faire :
$class = new C();

Voilà c’est tout pour ce tuto, et n’oubliez surtout pas : BI-DOU-ILLEZ !

Source : PHP.net.

PHP : Vérifier le format d’une adresse email.

Icône courrier

Un truc que j’aime bien en programmation, ce sont les expressions régulières. On peut notamment vérifier si le format d’une adresse email est bon. Dans l’absolu, ça ne vous dit pas si l’adresse existe vraiment. Pour cela il n’y a pas de solution miracle. Je vous présente donc une petite fonction qui vous permettra de vérifier la validité d’une adresse email :

function is_email($email) {
  $str   = '[-a-z0-9!#$%&\'*+\\/=?^_`{|}~]';
  $domain = '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)';
  $pattern = '/^'.$str.'+'.'(\.'.$str.'+)*'.'@'.'('.$domain.'{1,72}\.)+'.$domain.'{2,72}$/i';
  return preg_match($pattern, $email);
}

Voilà c’est tout pour ce tuto, et n’oubliez surtout pas : BI-DOU-ILLEZ !

Lancer une commande shell depuis PHP

Icone d'un terminal, shell.

Dans ce tutoriel nous allons voir comment exécuter une commande via le Shell à partir de PHP. Une petite recherche google vous démontrera que cette question intéresse pas mal de monde. Pourtant il existe une fonction PHP qui fait cela très bien : shell_exec.

Attention à ne pas faire n’importe quoi avec cette fonction ! Il est très important que vous relisiez vos script avant de les exécuter sous peine d’endommager votre système même si de mon expérience, j’ai constaté que les commandes les commandes qui requièrent les droits root ne sont pas exécutées.

Désactiver le safe_mode.

Pour les versions de PHP antérieures à PHP 5.3.0, il faut que le safe_mode soit désactivé. Cherchez dans votre php.ini (/etc/php5/apache2/php.ini pour Ubuntu) la ligne où il y safe_mode ou ajouter-la si elle n’existe pas.

safe_mode = Off

Redémarrez votre serveur Apache /etc/init.d/apche2 restart en tant que root et ce devrait être fonctionnel. Depuis PHP 5.3.0, cette fonctionnalité est obsolète.

Lancer une ou plusieurs commandes avec ou sans sortie.

Lancer une simple commande :

shell_exec("touch example.txt");

Si votre commande implique une sortie :

print shell_exec("ls example/");

ou encore mieux :

print "<pre>".shell_exec("ls example/")."</pre>";

Il est possible d’exécuter plusieurs commandes à la fois avec && ou en allant à la ligne :

print "<pre>".shell_exec("echo 'Test 1' > example1.txt && chmod 777 example1.txt")."</pre>";

print "<pre>".shell_exec("echo 'Test 1' > example1.txt > \n chmod 777 example1.txt")."</pre>";

print "<pre>".shell_exec("echo 'Test 1' > example1.txt >
chmod 777 example1.txt")."</pre>";

Lancer un script contenu dans un fichier.

Pour exécuter un script contenu dans un fichier, utilisez file_get_contents. Cette fonction permet de récupérer le contenu d’un fichier.

print "<pre>".shell_exec(file_get_contents("script.sh"))."</pre>";

Voilà c’est tout pour ce tuto, et n’oubliez surtout pas : BI-DOU-ILLEZ !

Source : Documentation PHP.