php-experts.org - développement php et internet http://www.php-experts.org Ressources sur le développement internet, PHP/MySQL, Ajax, marketing online, référencement... Sat, 19 Jun 2010 14:23:03 +0000 http://wordpress.org/?v=2.9.2 en hourly 1 Wordpress et les child themes http://www.php-experts.org/developpement-web/wordpress/wordpress-child-themes-418 http://www.php-experts.org/developpement-web/wordpress/wordpress-child-themes-418#comments Sat, 19 Jun 2010 14:23:03 +0000 Didier http://www.php-experts.org/?p=418 A l’occasion de la sortie de Wordpress3, je me suis penché sur le code et sur les dernières fonctionnalités qui ont été ajoutées au moteur de blog. Surprise, j’ai “raté” pas mal de nouvelles choses et il va falloir que je me remette à niveau. Première plongée dans les nouveaux moyens que propose Wordpress pour arriver à personnaliser son blog sans altérer le code principal (le core), je me suis penché sur les child themes.

Un thème Wordpress est un template complet, qui permet de personnaliser l’affichage de l’ensemble des parties du blog. Maintenu par un auteur tiers, on n’est pas à l’abri d’une évolution (via l’installateur automatique de mises à jour), qui pourrait écraser d’éventuelles modifications apportées pour customiser le thème.

Pour éviter ça, a été mis en place le système de child themes : il est possible de créer un thème “enfant” pour n’importe quel thème installé. Concrètement, les child themes utilisent un procédé d’override : si aucun fichier spécifique n’est trouvé dans le thème enfant, c’est le fichier correspondant pour le thème parent qui est utilisé.

Pour déclarer un child theme, il suffit de créer un dossier dans votre répertoire /wp-content/themes/. Il faudra y placer une feuille de style, nommée style.css, qui reprendra les informations suivantes :

  1. /*
  2. Theme Name:     TwentyTenChildTheme
  3. Theme URI:      http: //www.php-experts.org/
  4. Description:    Child theme for TwentyTen
  5. Author:         Didier Sampaolo
  6. Author URI:     http: //www.php-experts.org/
  7. Template:       twentyten
  8. Version:        0.1.0
  9. */
  10. @import url("../twentyten/style.css");

Une fois le fichier créé, vous pourrez aller activer votre thème dans l’onglet Apparence de l’administration de votre blog, comme un thème classique. Une mention du thème parent apparaitra pour vous confirmer que vous êtes en train d’activer le bon thème.

Les deux lignes les plus importantes sont Template: qui indique à Wordpress quel est le thème parent (il faut indiquer le nom de son répertoire à partir de /themes/ ) et @import, qui permet d’importer la feuille de style du parent. Sans cette ligne, la feuille de style n’est pas chargée pour vous permettre de repartir sur des bases propres.

Ensuite, tous les fichiers du thème parent sont chargés, à moins qu’un fichier équivalent soit trouvé pour le child theme. En pratique, pour modifier le footer, il vous suffit de créer un fichier footer.php dans le dossier de votre thème-enfant, et d’y placer votre code. Celui-ci peut être une légère variation du code du footer du thème parent, ou un code tout à fait nouveau et original.

Du coup, quand le thème parent est mis à jour, vous pouvez appliquer ces changements et théoriquement, dans la majorité des situations, votre thème enfant restera inchangé.

]]>
http://www.php-experts.org/developpement-web/wordpress/wordpress-child-themes-418/feed 0
Pseudo-code et calcul du PGCD http://www.php-experts.org/developpement-web/algoritmes/pseudo-code-et-calcul-du-pgcd-391 http://www.php-experts.org/developpement-web/algoritmes/pseudo-code-et-calcul-du-pgcd-391#comments Fri, 30 Oct 2009 11:23:43 +0000 Didier http://www.php-experts.org/?p=391 Dans cet article, qui fait partie d’une série sur les algorithmes usuels en PHP, nous verrons comment rédiger du pseudo-code pour modéliser nos fonctions PHP. L’algorithme présenté n’est pas là en raison de sa surpuissance ou de son utilité (pas flagrante dans la vie courante… ou du moins pas dans la mienne), mais simplement parce qu’il est facile à comprendre. Merci :)

Le “Plus Grand Commun Diviseur” est le nombre entier maximal qui divise deux autres entiers (deux, ou plus!). Par exemple, le PGCD de 30 et 12 est 6: il n’y a aucun nombre entier (integer) supérieur à 6 qui puisse diviser à la fois 12 et 30. Pour calculer le PGCD, théoriquement, on décompose chaque entier en produit de nombres premiers. Ca donne, pour 30 : 2×3x5 et pour 12 : 2×2x3. Quand on prend les facteurs en commun dans les deux expressions, on a bien 3×2 = 6.

Mais décomposer un nombre en produits de nombres premiers n’est pas à proprement parler simple en termes de calculs. Surtout pour un ordinateur, où les divisions coûtent toujours plus cher au niveau du processeur, et à plus forte raison quand, comme ici, il faudra en faire en grand nombre. Assez difficile donc d’en tirer un algorithme facile à réutiliser et à comprendre.

Calcul du PGCD par l’Algorithme d’Euclide

Sauf avec l’Algorithme d’Euclide, qui part du principe que :

si un nombre entier divise deux autres nombres entiers, alors il divise leur différence (et leur somme). Il divisera donc les différences successives du plus petit ôté du plus grand.

Source: Wikipedia, PGCD (Mathématiques élémentaires)

Il devient alors très simple de trouver le PGCD de deux entiers, sans effectuer la moindre division. On soustrait le plus grand entier au plus petit, jusqu’à obtenir le plus petit reste non nul. Reprenons l’exemple de 30 et 12 :

30 – 12 = 18
18 – 12 = 6

Et voila !

Le code de l’Algorithme d’Euclide de calcul du PGCD

Pour pouvoir écrire le code de notre fonction à partir de l’énoncé de l’Algorithme, il faut qu’on traduise les étapes de la résolution du problème en “pseudo-code”. Le pseudo-code est une simple syntaxe qui utilise des mots classiques et ressemble fort à du code, mais sans référence à un langage de programmation en particulier. C’est une étape intermédiaire entre le langage naturel et les langages de programmation. Son but est de modéliser le cheminement “de pensée” de l’Algorithme.
Ici, on dirait :

Soient $a et $b deux entiers. (On devra les passer comme paramètres de notre fonction)
Tant que (reste de la soustraction des deux entiers) > entier le plus petit et 0, on continue.

On passe ensuite au vrai code PHP, qui traduit simplement ce pseudo-code :

  1. function pgcd($a,$b) {
  2.     $reste = $b;
  3.     while($reste > $a && $reste > 0) {
  4.         $reste -= $a;
  5.     }
  6.     return $reste;
  7. }
  8. echo pgcd(12,30);

Remarques sur le code : Le code présenté n’est pas du tout optimal. Il faudrait, notamment, vérifier que l’entier le plus petit est bien le premier paramètre de la fonction. Bref, c’est un exemple.

Comme on le voit, l’Algorithme d’Euclide permet de trouver très simplement le PGCD de deux entiers (ou plus en modifiant un peu la fonction) sans effectuer de division, avec une seule boucle.

Et en passant par l’étape du pseudo-code, on sait déjà clairement où on va avant même d’écrire la première ligne de code. Ici, cela semble trivial, voire même superflu, mais ma vie a déjà été sauvée par quelques lignes de pseudo-code laissées en commentaires dans une fonction particulièrement ardue. Essayez, vous verrez !

]]>
http://www.php-experts.org/developpement-web/algoritmes/pseudo-code-et-calcul-du-pgcd-391/feed 0
Le tri bulle, ou tri par propagation http://www.php-experts.org/developpement-web/algoritmes/le-tri-bulle-ou-tri-par-propagation-382 http://www.php-experts.org/developpement-web/algoritmes/le-tri-bulle-ou-tri-par-propagation-382#comments Thu, 29 Oct 2009 13:09:14 +0000 Didier http://www.php-experts.org/?p=382 (en anglais: bubble sort)

Le tri bulle est un très bon algo au point de vue didactique mais mauvais en termes mathématiques (complexité trop grande). Son but est de trier une liste de valeurs pour la renvoyer en ordre croissant. Pour cela, l’algo parcours les éléments de la liste deux par deux, et les classe en ordre croissant (il les permute si le 2e élément est le plus petit). Une fois la liste finie, le tri-bulle recommence. Lorsqu’un parcours a été fait entièrement sans avoir besoin de faire une permutation, le tri est fini.

Attention, le tri-bulle n’est que très rarement utilisé lorsqu’on a besoin d’opérations de tri, car il n’est pas très performant.
Cet article est le premier d’une série consacrée aux algorithmes connus et utiles, et est à prendre comme une “introduction” à l’algorithmique.

Le code du tri-bulle en PHP

  1. function bubblesort(&$liste) {
  2.     $nbItems = count($liste);
  3.     $permutation = true;
  4.     $nbPermutations = 0;
  5. // on continue tant qu’on a eu à faire des permutations…
  6.     while($permutation == true) {
  7.         $permutation = false;
  8.         for($i=0;$i<$nbItems-1;$i++) {
  9.             // si l’élément de gauche est le plus grand,
  10.             if ($liste[$i] > $liste[$i+1]) {
  11.                 // on échange la place des éléments
  12.                 $temp = $liste[$i+1];
  13.                 $liste[$i+1] = $liste[$i];
  14.                 $liste[$i] = $temp;
  15.                 $permutation = true;
  16.                 $nbPermutations++;
  17.             }
  18.         }
  19.         print_r($liste);
  20.     }
  21.     return array(‘nbpermutations’=>$nbPermutations);
  22. }
  23.  
  24. $liste = array(4,9,13,5,17,2,-6);
  25. $bubble = bubblesort($liste);
  26.  
  27. echo ‘Liste triée en ‘.$bubble[‘nbpermutations’].‘ permutations.’;

Remarques sur le code: j’ai volontairement passé la liste de valeurs par référence. Dans ce cas, la variable de départ est utilisée directement au lieu d’être copiée dans la fonction puis modifiée. On n’a donc pas besoin d’utiliser return pour récupérer la liste triée.

]]>
http://www.php-experts.org/developpement-web/algoritmes/le-tri-bulle-ou-tri-par-propagation-382/feed 1
L’EBG cherche un développeur web junior http://www.php-experts.org/developpement-web/offre-demploi-lebg-cherche-un-developpeur-web-junior-373 http://www.php-experts.org/developpement-web/offre-demploi-lebg-cherche-un-developpeur-web-junior-373#comments Wed, 26 Aug 2009 15:49:42 +0000 Didier http://www.php-experts.org/?p=373 Cherche développeur web junior ayant des connaissances en XHTML / CSS / Javascript / Ajax, PHP et MySql pour le développement d’un réseau social !

ELENBI, vous connaissez ?

Cette structure rassemble 2 entités :
- L’EBG (Electronic Business Group) présidé par Jean-Bernard Lévy (PDG de Vivendi), qui fédère plus de 550 grandes entreprises actives dans différents secteurs (http://www.ebg.net/subscribers.php pour voir la liste des adhérents)…
Ce club d’affaires propose le partage d’expériences autour de tables rondes sur des thèmes précis des nouvelles technologies dans le cadre de 7 cycles de conférences (nouveaux médias, mobilité, marketing & la communication, technologies, achats & B2B, télécommunications et systèmes d’information, droit et ressources humaines) et d’ouvrage comme Internet Marketing 2009.

- AGRION qui rassemble les professionnels de l’énergie, des matières premières et du développement durable.
Au même titre que l’EBG, les membres se retrouvent à l’occasion de conférences organisées sous le format de tables rondes concrètes et techniques, au rythme d’une par semaine. Le véhicule du futur, les bonnes pratiques du développement durable, les stratégies d’achats de matières premières, d’hydrocarbures… sont des sujets traités par ce club d’affaires.
2 ans après son lancement, Agrion a déjà une envergure internationale : 15 000 contacts, un bureau à Francfort, et une récente antenne à San Francisco.
Plus d’infos sur http://www.agrion.org

Mais EBG & AGRION, c’est également bientôt 2 sites web communautaires orientés web 2.0 !
Dans ce cadre, nous recherchons un développeur web junior, ayant des connaissances en XHTML / CSS / Javascript / Ajax, PHP et MySQL…

Statut : CDD
Début: dès que possible !
Lieu : Paris dans le 10ième
Durée : 3 à 6 mois et peut être plus (ouvert à vos contraintes !)
Rémunération : 1140 euros sur une base de 35 heures ou 7,52€ net de l’heure si profil de type alternance au ¾ temps.

Interessé ?
Merci d’envoyer votre CV à martin.tissier@ebg.net (de la part de Didier Sampaolo via PHP-Experts) ou à sampaolo@gmail.com et je transmettrais.

Mon avis :
L’EBG est une structure très sérieuse avec une réputation impeccable. Pour un jeune développeur, cette mission est un peu la cerise sur le gâteau qu’est un CV ;)

Important: en réponse aux nombreux commentaires qu’à reçu cet article, je précise que le développeur junior recruté ici rejoindra une équipe technique. Il n’a jamais été question de faire développer un réseau social complet par une seule personne, qui plus est avec peu ou pas d’expérience.

Quand je parle de “cerise sur le gâteau”, je veux dire qu’avoir une mission pour l’EBG sur un jeune CV est une bonne chose.

La durée de la mission étant ouverte à discussion, on peut imaginer que la rémunération l’est aussi.

]]>
http://www.php-experts.org/developpement-web/offre-demploi-lebg-cherche-un-developpeur-web-junior-373/feed 2
Concours de code http://www.php-experts.org/developpement-web/concours-php/concours-de-code-364 http://www.php-experts.org/developpement-web/concours-php/concours-de-code-364#comments Sat, 08 Aug 2009 13:28:11 +0000 Didier http://www.php-experts.org/?p=364 Au mois de juin, php-experts a eu un an. Le blog commence a entrer dans son âge adulte et remporte des succès dont je suis assez fier : flux repris par Planete PHP (fr) et par le Planete MySQL (fr), commentaires de pointures du domaine (notamment Eric Daspet et Mère Théresa, pour ne citer qu’eux), et un auditoire en augmentation constante (+150% mensuels selon Google Analytics).

Pour fêter cet anniversaire, j’ai décidé d’organiser un concours de code PHP, évidemment gratuit et ouvert à tous. Les participants (et leurs sites) seront tous présentés sur PHP-Experts. Vu que je sais que les développeurs sont des gens occupés (;)), le concours proposera un petit exercice de PHP assez simple (réalisable en quelques heures au maximum) qu’il faudra optimiser. Les performances obtenues seront benchmarkées et le ou les gagnants remporteront des lots.

Si le concours est un succès, d’autres suivront. Les exercices porteront sur des actions simples qu’il faut souvent réaliser en PHP, afin de faire découvrir à tous les bonnes pratiques de chacun. Par exemple, je pense que le premier exercice sera de lire un fichier texte, effectuer quelques traitements simples et afficher le résultat. Ca semble simple, mais ça va demander des accès disques, des boucles… Autant de choses qu’on croise tous les jours et qu’on néglige souvent de regarder de près.

Lots

Au niveau des lots, j’ai pensé à quelques bricoles: Tests d’entraînement en ligne pour la certification PHP Zend, bons d’achat pour des librairies en ligne proposant des livres intéressants sur le développement, espaces publicitaires gratuits sur mes sites (emplacements à déterminer en fonction de la cible), etc.
Et c’est là que j’ai besoin de vous, et que j’entame une carrière que j’espère prometteuse dans la mendicité électronique, sous forme d’appel aux dons. Chaque donateur d’un lot aura sa présentation sur PHP-Experts et ma reconnaissance éternelle. N’hésitez pas à me signaler en commantaire le geste que vous êtes prêts à faire, tous les cadeaux sont bons à prendre !

Je compte sur vous !

]]>
http://www.php-experts.org/developpement-web/concours-php/concours-de-code-364/feed 9
A la découverte d’Ubuntu: la première heure http://www.php-experts.org/developpement-web/admin-serveur/a-la-decouverte-dubuntu-la-premiere-heure-343 http://www.php-experts.org/developpement-web/admin-serveur/a-la-decouverte-dubuntu-la-premiere-heure-343#comments Sat, 25 Jul 2009 03:49:17 +0000 Didier http://www.php-experts.org/?p=343 Disclaimer

Je demande à mon lectorat de m’excuser pour ce post, qui ne concerne pas directement le développement, mais qui est un retour d’expérience de ma récente installation d’Ubuntu sur mon poste client principal. Je vulgarise volontairement beaucoup de choses, et j’essaye de m’éloigner -une fois n’est pas coutume- de ma vision habituelle de professionnel pour ne parler que des aspects “client”. Je travaille habituellement sous Windows. Je ne cherche pas à dire lequel système est le meilleur, je ne bomberai pas le torse en disant fièrement que je suis sous Ubuntu. Je livre seulement mes premières impressions après la bascule.

D’abord, pourquoi Ubuntu ?

Hébergeant depuis très longtemps l’ensemble de mes sites sous Linux Debian, j’ai appris il y a peu qu’il existait une Ubuntu en version serveur. Me demandant si la migration de ma Debian habituelle à Ubuntu Server pouvait m’apporter quelque chose, j’ai posé la question sur les forums officiels français Ubuntu. Et là, bon accueil, réponse rapide et en bon français, ça commençait bien. Et loin du prosélytisme Apple (si, si.), on m’a clairement dit que si je m’en sortais bien sous Debian, je ne gagnerais pas grand-chose, Ubuntu étant surtout pensée pour être utilisée en poste client (s’en est suivi une bonne vieille polémique, mais le ton est resté cordial et le thread est bourré d’infos intéressantes et d’avis personnels).
Pour quelqu’un qui est sous Windows depuis “toujours”, avec un long passage par RedHat à l’époque de la 7.2, quand les disques durs étaient en os et les souris en silex, et un bref et douloureux essai de quelques mois sous FreeBSD (où j’ai à peu près autant été dépaysé que si j’avais passé un week-end vers Alpha du Centaure), entendre parler d’un Linux “Client-Friendly” en 2009, ça m’a fait craquer et j’ai eu envie d’essayer. Surtout quelques jours après avoir installé Windows Seven par curiosité – et avec dans l’idée de publier mes impressions (ec que je n’ai pas fait puisque le retour d’expérience de Windows Seven sera fait en deux mots : “comme Vista”).

Détection du hardware

Lacie USB: détecté!

Lacie USB: détecté!

Je n’utilise pas un PC dernier cri, mais j’ai été agréablement surpris par la fiabilité de la détection du hardware sous Ubuntu. Aucun périphérique n’a posé de problème, de la carte réseau à la souris (molette y compris!). Même chose pour le disque dur externe en USB, qui est miraculeusement apparu lorsque je l’ai branché. Même les touches de raccourci présentes sur mon clavier (contrôle du volume) fonctionnent, ce qui n’était pas le cas sous Windows 7 RC1.
Ca m’a agréablement changé de l’époque, pas si lointaine que ça, où on devait éditer à la main, en console, le fichier de configuration du serveur X avant de pouvoir démarrer celui-ci, et où il fallait monter ses périphériques de stockage (en précisant à la main le type de système de fichier…).

Connexion à Internet

Là, pas grand-chose à dire. En Ethernet, je suis déjà connecté. Mon réseau Wifi domestique est aussi détecté et prêt à l’emploi. Pour la petite histoire, sous Debian, j’avais lutté plusieurs jours (ok, j’ai deux mains gauches, mais quand même…) avant de faire reconnaître ma carte Wifi, qui est semble-t-il un peu exotique (une vieille Hercules).

Socialiser sous Ubuntu : la messagerie instantanée

Par défaut est installé Pidgin, un client basé sur libpurple et écrit en Gtk+. Il est compatible avec la plupart des réseaux modernes : MSN, Yahoo!, XMPP (donc Google Talk), ICQ, IRC, plus tout un tas d’autres, dont je n’ai jamais entendu parler, comme Lotus Sametime, Zephyr, MySpaceIm, Gadu-Gadu et QQ.
Il est possible de se connecter sur plusieurs réseaux (et avec plusieurs comptes) simultanément. Pidgin semble pouvoir accepter des plugins et des smileys personnalisés (bah si, moi ça m’a réjoui de voir ça).

Client IRC : Xchat. Pas fan de l’interface (trop hatibué à mIRC dans ma folle jeunesse). Détail sympa: quand on installe Xchat via apt-get, le raccourci se met tout seul dans Applications/Internet/Xchat

En console

Avec un processeur 64bits, l’installation graphique du plugin Flash pour Firefox a échoué (mauvaise architecture). Il a donc fallu passer en console pour essayer de l’installer à la main. Après un petit essai infructueux, mon shell me répond “Essayez avec sudo apt-get install flashplugin-installer“. Et ça a marché.
Dans le même esprit, si je tape “mysql” alors que je n’ai pas de client installé, on me répond que cet exécutable est dans le paquet “mysql-client”. Je sens que les apt-cache search à la recherche de paquets dont j’ai oublié le nom vont se faire assez rares.

Audio / Vidéo

Notification RythmBox (lecteur audio)

Notification RythmBox (lecteur audio)

Fait amusant, le support du mp3 n’est pas installé par défaut (licence oblige…). Quand j’ai lancé RythmBox, le player audio Gnome préinstallé, on m’a proposé d’installer le “greffon” (plugin) nécessaire. Même chose pour le AAC (Il m’a semblé voir que les plugins en question s’appelaient “bad” et “ugly”).
RythmBox ressemble à s’y méprendre à iTunes, mis à part qu’il intègre quelques fonctions sympa en rapport avec le net, dont le support de Webradios et de Last.fm. Petit plus appréciable: on peut préciser avec quels morceaux on souhaite continuer la lecture (Queue). Une fois la file d’attente vidée, la lecture aléatoire reprend son cours.
Côté vidéo, le lecteur fourni, Totem (qui utilise GStreamer) lit les fichiers courants, DivX aussi bien que MKV (y compris en HD). J’ai testé avec un fichier contenant plusieurs pistes : les changements de langue, de sous-titres, de chapitre: tout à fonctionné comme prévu. Rien à redire, donc.

LE gros point noir: merci Apple

Evidemment, il fallait que quelque chose cloche. Mais ce n’est pas de la faute d’Ubuntu. Mon gros point noir est causé par Apple, puisque je ne peux pas synchroniser mon iPhone non-jailbreaké avec mon système Ubuntu. Qui plus est, le Jailbreak était considéré comme légal tant qu’il était réalisé à des fins d’interopérabilité (ce qui est le cas ici) mais cela à changé depuis le firmware 3. C’est maintenant interdit. Sans commentaires.

Conclusion

Très agréablement surpris par ma première heure sous Ubuntu, j’envisage déjà une migration définitive vu que je n’ai à déplorer aucune perte de fonctionnalité (à part pour l’iPhone, encore un grand merci à Apple). Le système répond bien, même avec de nombreuses applications lancées en simultané (on perd vite l’habitude du VRAI multithread…). Il va falloir que je me penche sérieusement sur la compatibilité entre quelques programmes et leurs penchants opensource (je pense notamment à OpenOffice et Microsoft Office) et si tout se passe bien, c’est fini!

Merci aux utilisateurs des forums Ubuntu-fr.org pour leur accueil sympathique :)

]]>
http://www.php-experts.org/developpement-web/admin-serveur/a-la-decouverte-dubuntu-la-premiere-heure-343/feed 4
Les bases de données épaisses http://www.php-experts.org/bases-de-donnees/mysql/les-bases-de-donnees-epaisses-297 http://www.php-experts.org/bases-de-donnees/mysql/les-bases-de-donnees-epaisses-297#comments Mon, 13 Jul 2009 01:16:47 +0000 Didier http://www.php-experts.org/?p=297 Frédéric Brouard a lancé un pavé dans la marre du développement en expliquant le concept de “bases de données épaisses“. Il va même plus loin en affirmant que ce mode de développement peut assassiner les ORM et les FrameWorks.

Pour rappel, l’ORM (pour “Object-Relational Mapping“) vise à faire correspondre un objet de la couche applicative aux données qu’il exploite dans la base de données. En quelque sorte, on a donc une “base de données orientée objet” puisque, pour faire très simple, chaque champ de la base peut être une propriété d’un objet. Mais selon Frédéric Brouard, le concept mérite qu’on s’y attarde et qu’on le développe.

Dans un applicatif exploitant une base de données épaisse, ce n’est ni le client ni le serveur web qui doivent réaliser le maximum des opérations nécessaires, mais bel et bien la base de données. Outre le fait qu’on obtient une application plus facilement portable (puisque le PHP ne ferait plus ou moins que de l’affichage), on supprime aussi un goulot d’étranglement important en éliminant les aller/retour incessants entre l’applicatif et la base.

Pour prendre un exemple simple, quand on veut calculer une moyenne, on ne rapatrie pas l’ensemble des lignes à prendre en compte avant de faire un calcul à la main, on utilise plutot la fonction AVG() qui exécute le traitement nécessaire et ne renvoie qu’un résultat final.

Avec une base de données épaisse, en utilisant notamment des requêtes SQL avancées, les procédures stockées, et pourquoi pas des User-Defined Functions (UDF) sous MySQL, on peut arriver au même résultat avec la majorité des traitements que nécessitent une application.

En déportant son code métier vers la base de donnée quand cela est possible, non seulement on décharge les serveurs frontaux, mais on améliore aussi la circulation des données dans l’ensemble de l’architecture, puisqu’on ne rapatrie à aucun moment de gros resultsets uniquement pour les traiter. Les liens entre base de donnée et applicatifs sont ainsi préservés.

La base se retrouve donc avec plus d’opérations à réaliser, mais il faut bien le reconnaître: sur un site à fort trafic, à moins qu’on aie beaucoup d’écritures à réaliser, c’est rarement la base – même avec un certain volume d’informations – qui représente le goulot d’étranglement le plus étroit. C’est souvent plutôt le serveur Web et la couche réseau en général qui saturent (J’ai plus souvent vu 1 BDD + 3 Apache en front que le contraire…).

Du coup, le principe d’ORM peut être tué, mais aussi sublimé: une base de données épaisse pourra ne pas embarquer que la partie “stockage” d’un objet (propriétés) mais aussi sa partie “métier” (méthodes). Et si possible, tout le reste, et en restant basé sur du relationnel, donc sans avoir à quitter son SGBDR favori ;)

Liens

Le Monde Informatique : Les ORM et les frameworks survivront-ils au concept de développement en base de données épaisse ?
Frédéric Brouard, alias SQLPro sur Développez.com

]]>
http://www.php-experts.org/bases-de-donnees/mysql/les-bases-de-donnees-epaisses-297/feed 7
Symfony Live, par Sensio Labs http://www.php-experts.org/developpement-web/php-developpement-web/actualites-php/symfony-live-par-sensio-labs-290 http://www.php-experts.org/developpement-web/php-developpement-web/actualites-php/symfony-live-par-sensio-labs-290#comments Mon, 08 Jun 2009 23:18:25 +0000 Didier http://www.php-experts.org/?p=290 Sensio Labs organise la 1ère édition du Symfony Live, conférence francophone dédiée au framework PHP open source Symfony. ( Rendez-vous les 11 & 12 juin, Cité Universitaire Internationale Paris 14° ).

Au programme de ces deux journées :
- Conférences inédites sur les thèmes : réseaux sociaux, stratégies de migration, gestion de médias, Symfony 2…
- Retours d’expériences : Dailymotion, Yahoo!, L’Express…
- Experts : Fabien Potencier, Créateur et Lead developer de Symfony et PDG de Sensio Labs, Dustin Whittle, évangéliste Yahoo!, Jonathan Wage, Lead developer de Doctrine ORM…

Programme complet ici : http://www.symfony-live.com/schedule

A noter, cette manifestation a aussi le soutien de la très sérieuse AFUP. Cette première conférence française entièrement consacrée au framework Symfony est très attendue dans la communauté et personnellement, si mon agenda l’avait permis, j’aurais beaucoup aimé pouvoir y montrer mon nez.
Vous pourrez suivre la conférence en direct sur Twitter (@sflive09fr)

]]>
http://www.php-experts.org/developpement-web/php-developpement-web/actualites-php/symfony-live-par-sensio-labs-290/feed 0
Procédures et fonctions sous MySQL: les bases http://www.php-experts.org/bases-de-donnees/mysql/procedures-et-fonctions-sous-mysql-les-bases-231 http://www.php-experts.org/bases-de-donnees/mysql/procedures-et-fonctions-sous-mysql-les-bases-231#comments Sun, 10 May 2009 21:37:21 +0000 Didier http://www.php-experts.org/?p=231 Oracle dispose d’un langage appelé PL/SQL pour compiler des procédures et des fonctions sur le serveur. Ces procédures et fonctions peuvent être appelées directement en SQL. Quand elles sont écrites correctement, elles permettent en général un gain de performances non négligeable, en plus d’être pratiques et agréables à utiliser. En gros, les procédures et fonctions sont un excellent moyen d’apporter une couche d’intelligence supplémentaire à votre serveur de bases de données, en lui permettant d’exécuter des actions complexes sans avoir recours à des scripts extérieurs. On économise donc le protocole de communication entre base de données et application. Et bien… C’est possible aussi sous MySQL !

Mini rappel : Procédure, ou fonction ?

Si vous hésitez entre créer une procédure stockée ou une fonction, rappelez vous bien que la seule différence entre les deux est qu’une fonction va chercher un résultat (quitte à passer par des tonnes d’étapes intermédiaires), alors qu’une procédure va faire une action. En gros, si vous voulez avoir une valeur de retour, il vous faut une fonction. Dans le cas contraire, préférez une procédure.

Dans quel cas les utiliser, et comment ?

Vous pouvez vous tourner vers les ProcStock (pour “procédures stockées”, le terme étant souvent utilisé aussi pour les fonctions) partout où vous exécutez des traitements de calculs lourds et/ou sur de gros volumes de données. L’avantage énorme est que vous n’aurez pas à rapatrier des resultsets de grande taille, pour les traiter en PHP (par exemple), puis les insérer en base: tout se fera directement en une seule requête très simple, qui appellera la fonction/procédure.
Les fonctions MySQL que vous allez définir s’utilisent exactement comme les fonctions prédéfinies (bien que celles-ci soient en général écrites en C et compilées avec le serveur… c’est faisable aussi pour un gain maximal en performances MySQL, mais ceci est une autre histoire), comme par exemple AVG (qui calcule une moyenne sur les valeurs d’un champ). Sans AVG (syntaxe: SELECT AVG(champ) FROM table), il faudrait récupérer les résultats concernés, les ajouter, puis les diviser par leur nombre : (1+5+6)/3 = 4. AVG fait ça toute seule et renvoie directement 4. Bien évidemment, il n’est pas bien grave d’avoir à récupérer 3 lignes. Mais avec 20.000 enregistrements, c’est différent, et les performances seront affectées, notamment en raison de l’utilisation de RAM nécessaire à l’exécution du script.
Il peut être aussi très intéressant d’utiliser des procédures et fonctions sur le serveur de bases de données quand plusieurs applications frontend dans des langages différents peuvent avoir à réaliser les mêmes actions: plutôt que d’écrire (et maintenir…) les actions communes en plusieurs langages, autant déporter leur exécution sur le serveur SQL, et demander aux clients de seulement interagir avec les fonctions stockées.

Application concrète

(je déplore mon manque d’imagination, qui m’oblige à chaque post à sortir des exemples totalement improbables…)
Imaginons un site de vente en ligne. Chaque jour est généré un rapport, enregistré en base, qui, en fonction du détail des ventes de la journée, calcule des indicateurs comme le chiffre d’affaires global et le panier moyen.
On aurait donc une table “commandes” avec un champ “montant” et un champ “date” (je simplifie, hein).
En PHP, sans procstock, il faut :

  • Envoyer une requête qui prend les ventes de la journée passée
  • Récupérer dans un tableau le détail des transactions
  • Faire les calculs nécessaires (nombre de lignes, moyenne des montants, total des montants)
  • Stocker ces résultats en base

Au bas mot, cela représente une vingtaine de lignes de PHP, avec deux communications depuis/vers la base de données, une boucle qui parse le tableau, des variables temporaires…
Dans cette situation, c’est d’une procédure stockée que nous avons besoin. On ne récupère pas les infos (pas de valeur retournée) mais on les stocke en base. Dans le cas contraire, on aurait créé une fonction.
La procédure stockée en question, que nous appellerons “genere_rapport”, va s’occuper de tout cela pour nous. Voici son code :

  1. DELIMITER //;
  2. CREATE PROCEDURE genere_rapport()
  3.   BEGIN
  4.     DECLARE nb_commandes INTEGER(5);
  5.     DECLARE panier,chiffre_affaires FLOAT;
  6.     SELECT COUNT(*),AVG(montant),SUM(montant) INTO nb_commandes,panier,chiffre_affaires FROM commandes LIMIT 1;
  7.     INSERT INTO rapports (nb_com, panier_moyen, ca_total) VALUES (nb_commandes, panier, chiffre_affaires);
  8.   END//
  9. DELIMITER ;

MySQL devrait répondre “Query OK, 0 rows affected (0.01 sec)” pour signaler que la procstock a bien été créée.
Première remarque, on change le délimiteur de fin de commande MySQL. La création d’une procédure/fonction doit se faire en une seule instruction MySQL, même si la procstock comporte plusieurs instructions à exécuter. J’avoue que ça surprend au début mais c’est un coup à prendre. Pensez bien à remettre le délimiteur normal (le point-virgule) après la création de votre procstock.
Ensuite, on lance la création de la procédure. On déclare d’abord les variables dont on aura besoin pour stocker les données (même si ici, on aurait pu directement faire le SELECT dans une sous-requête de l’INSERT, mais ce n’est pas le but): la liste des types disponibles est la même que les types des champs. On utilise ensuite SELECT INTO avec le nom de nos variables pour dire à MySQL dans quelle variable stocker quelle valeur, variables qu’on utilise ensuite dans une requête INSERT classique pour stocker le rapport.
Pour appeler la procédure, on fera CALL genere_rapport();. Pour une fonction, ça sera SELECT nom_de_la_fonction();

Conclusion

Penchez-vous sur vos applications PHP, il y a certainement des tas d’actions que vous pourrez déporter vers des procédures stockées. Les gains de performances devraient être rapidement ressentis, pour un effort d’apprentissage minimal.
Dans un prochain post, nous irons plus loin avec les procédures stockées, en utilisant notamment des paramètres, des curseurs, des handlers, et autres joyeusetés. Le plus difficile sera de trouver un exemple intéressant… ;)

]]>
http://www.php-experts.org/bases-de-donnees/mysql/procedures-et-fonctions-sous-mysql-les-bases-231/feed 3
CSV et MySQL : SELECT INTO OUTFILE et LOAD DATA INFILE http://www.php-experts.org/bases-de-donnees/mysql/csv-mysql-select-into-outfile-load-data-infile-206 http://www.php-experts.org/bases-de-donnees/mysql/csv-mysql-select-into-outfile-load-data-infile-206#comments Mon, 27 Apr 2009 01:05:07 +0000 Didier http://www.php-experts.org/?p=206 J’ai eu à me pencher sur les imports-exports sous MySQL. Mon but était de disposer de fichiers utilisables dans un format “humain” (comprendre: que les gens du marketing pouvaient exploiter avec leur cher Excel) sans pour autant passer par des scripts de conversion hasardeux et lourds pour le serveur. Il a donc fallu que je cherche les meilleures solutions pour pouvoir générer et importer des fichiers CSV dans MySQL,mon SGBDR favori. J’ai dû me servir du couple SELECT INTO OUTFILE pour les exports, et LOAD DATA INFILE pour les imports. Petit rappel syntaxique.

Exports CSV avec MySQL : SELECT INTO OUTFILE

Le principe de SELECT INTO OUTFILE est simple: réaliser un export de données en écrivant un resultset (résultats d’exécution d’une requête) directement dans un fichier CSV sur le serveur. Pour cela, l’utilisateur avec lequel vous vous connectez à MySQL doit avoir le priilège “FILE”. Autre remarque, vous ne pourrez en aucun cas écraser un fichier déjà existant sur le serveur (ceci pour la simple et bonne raison qu’il serait assez dommageable d’écraser, par exemple, votre fichier /etc/passwd).

Voici donc la syntaxe, finalement assez simple, de la fonction SELECT INTO OUTFILE :

  1. SELECT champ
  2. FROM TABLE
  3. WHERE champ = ‘valeur cherchée’
  4. INTO OUTFILE ‘/var/dump.csv’
  5. FIELDS
  6.     TERMINATED BY ‘;’
  7.     OPTIONALLY ENCLOSED BY ‘"’

Dans le fichier exporté, les champs ne sont pas délimités, sauf si vous utilisez FIELDS ENCLOSED BY. Le OPTIONALLY spécifie que seules les chaînes de caractères doivent être encadrées.
Le délimiteur par défaut est l’espace. Pour en utiliser un autre (virgule, point-virgule, tabulation, …) il faut utiliser la directive FIELDS TERMINATED BY. Evidemment, on peut utiliser des caractères spéciaux comme la tabulation ‘t’ ou le retour à la ligne ‘n’ (éventuellement CR+LF sous Windows, donc ‘rn’). Il existe aussi LINES TERMINATED BY pour contrôler le caractère de fin de ligne.

Du coup, en lançant sur la base de mon blog cette requête :

  1. mysql> SELECT ID,post_title,comment_count
  2. FROM `wp_posts`
  3. WHERE `post_status` = ‘publish’
  4.  ORDER BY `post_date` DESC LIMIT 3
  5. INTO OUTFILE ‘/tmp/blog_posts.dump’
  6. FIELDS
  7. TERMINATED BY ‘;’
  8. OPTIONALLY ENCLOSED BY ‘"’;

j’ai pu récupérer un fichier plat qui donnait :

  1. 179;"plugin : yURL ReTwitt";1
  2. 22;"5 plugins indispensables pour coder en PHP avec l’IDE Eclipse";0
  3. 138;"plugin : wp_list_sub_pages()";0

Soit, un joli fichier CSV bien propre, directement exploitable (pourquoi pas par Excel).

Imports de CSV dans MySQL : LOAD DATA INFILE

Le LOAD DATA INFILE, qui permet de faire l’exact inverse du INTO OUTFILE, est tout aussi simple à utiliser. Dans les bonnes conditions, c’est vraiment l’un des outils d’import MySQL les plus puissants.
Déjà, bonne nouvelle, la syntaxe des commandes qui permet à LOAD DATA INFILE de repérer les débuts et fin de champs (et de ligne) est la même que pour SELECT INTO OUTFILE. On retrouve donc sans surprise les FIELDS TERMINATED BY et autres joyeusetés.
Une gestion des doublons est aussi possible grâce aux mots-clefs IGNORE et REPLACE, qui parlent d’eux-même. Déclenchés en cas de doublon dans une clé (primaire ou unique), REPLACE effacera l’ancienne ligne pour la remplacer par la nouvelle. Attention donc, vous perdrez donc la pérennité de vos ID puisque ceux-ci changeront lors de l’import de données. IGNORE permettra simplement de conserver l’ancienne ligne, les nouvelles données n’étant pas écrites: vous conservez vos ID mais perdez le bénéfice de l’import sur cette ligne.
Vous pouvez aussi spécifier la liste des champs dans lesquelles les données doivent être stockées avec la syntaxe classique “(champ1, champ2, champ3)” (sans guillemets) en fin de commande.
Pour prendre un exemple, avec un fichier de la forme :

  1. 1;120;"texte1";
  2. 2;240;"texte2";

En imaginant qu’on ne veut garder que l’id (champ 1) et le texte (champ 3), et les insérer dans les champs correspondants de la table SQL “data”, on peut utiliser le paramètre @dummy pour demander au serveur d’ignorer l’un des champs du CSV. Cela nous donne une requête de la forme :

  1. LOAD DATA INFILE ‘/tmp/data.csv’
  2. INTO TABLE `data`
  3. FIELDS
  4. TERMINATED BY ‘;’
  5. OPTIONALLY ENCLOSED BY ‘"’
  6. (id, @dummy, texte)

Et si par malheur votre fichier commence par 2 lignes d’entête, pas de souci, vous pouvez présicer IGNORE 2 LINES dans la requête pour que soient ignorées les 2 premières lignes.

Et voila. Deux commandes, finalement pas bien complexes une fois qu’on les a prises en main, qui permettent de gérer efficacement les imports/exports de fichiers CSV sous MySQL. Pour faire suite à cet article, nous verrons bientôt comment optimiser la vitesse de vos INSERT dans MySQL.

]]>
http://www.php-experts.org/bases-de-donnees/mysql/csv-mysql-select-into-outfile-load-data-infile-206/feed 3