PHP : PSR pour ceux qui ont raté le coche

Actuellement en poste chez France Télévisions j’ai fait adopté à mes équipes et mes sous traitants la suite de convention PSR. Pour ceux qui auraient loupé un épisode dans le fabuleux monde de PHP mais surtout sur dans un monde qui veut aller vers du mieux, PSR c’est une suite de « normes ». Actuellement il y a 4 chapitres dans PSR nommés très justement PSR-0, PSR-1, PSR-2 et je vous le donne dans le mille, PSR-3.

C’est une suite qui va plus loin qu’une « simple » convention PEAR ou ZEND, je ne vais pas tout vous citer ici mais voici ce que vous trouverez dans chaque chapitre.

PSR-0

L’objectif c’est en se basant sur le namespace d’une classe être capable de la charger. C’est ce qu’on appelle l’autoloader.

Toutes les infos sur github : https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md

PSR-1

L’objectif c’est de définir une convention de codage « à minima »

  • Files MUST use only <?php and <?= tags.
  • Files MUST use only UTF-8 without BOM for PHP code.
  • Files SHOULD either declare symbols (classes, functions, constants, etc.) or cause side-effects (e.g. generate output, change .ini settings, etc.) but SHOULD NOT do both.
  • Namespaces and classes MUST follow PSR-0.
  • Class names MUST be declared in StudlyCaps.
  • Class constants MUST be declared in all upper case with underscore separators.
  • Method names MUST be declared in camelCase.

Toutes les infos sur github : https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md

PSR-2

L’objectif est d’enrichir PSR-1. Il n’y a qu’un point avec lequel je suis en désaccord, c’est la limitation du nombre de caractères par ligne que je trouve trop bas.

  • Code MUST follow PSR-1.
  • Code MUST use 4 spaces for indenting, not tabs.
  • There MUST NOT be a hard limit on line length; the soft limit MUST be 120 characters; lines SHOULD be 80 characters or less.
  • There MUST be one blank line after the namespace declaration, and there MUST be one blank line after the block of usedeclarations.
  • Opening braces for classes MUST go on the next line, and closing braces MUST go on the next line after the body.
  • Opening braces for methods MUST go on the next line, and closing braces MUST go on the next line after the body.
  • Visibility MUST be declared on all properties and methods; abstract and final MUST be declared before the visibility;static MUST be declared after the visibility.
  • Control structure keywords MUST have one space after them; method and function calls MUST NOT.
  • Opening braces for control structures MUST go on the same line, and closing braces MUST go on the next line after the body.
  • Opening parentheses for control structures MUST NOT have a space after them, and closing parentheses for control structures MUST NOT have a space before.

Toutes les infos sur github : https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md

PSR-3

L’objectif c’est de définir comment votre application doit logger des évènements. Je trouve l’idée intéressante mais je suis un peu dubitatif sur le fait que ce soit un standard.

Toutes les infos sur github : https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md

 

Je continue sur PSR, pour ceux qui voudraient passer leur code aux normes PSR, Sensio Labs (Symfony) a publié un outil pour faciliter la mise en place : http://cs.sensiolabs.org/. Je ne l’ai pas testé personnellement, mais je suis preneur de vos retours dans les commentaires ;)

Enfin pour terminer le chapitre PSR, voici un outil pour vérifier dans votre environnement d’intégration continue que tout est conforme, grâce à une implémentation des rulesets de PHP_CodeSniffer disponible ici :https://github.com/klaussilveira/phpcs-psr .

Voila ça fait une petite piqûre de rappel ou qui sera peut être une grande découverte pour d’autres ;)

PHP : MSSQL / ODBC sous Linux

Ajourd’hui je réalise un petit script PHP pour surveiller les résultats d’une requête. Le script sera sur une vieille debian lenny et devra interroger une base de données SQL Server 2008. Ca sent le traquenard, mais je me lance dedans. J’ai déjà utilisé le module pdo_odbc dans un précédent projet, mais sur une distribution récente ou sur ma machine sous archlinux.

Bref, j’installe mon module, freetds et tout ce qui va bien. Vérification avec isql, tout est OK. Je lance mon script et la « Segmentation Fault ». Oh god why… Après multiples vérifications des configurations, des dépendances que j’aurais pu oublier, je tombe sur des pelletés de bug report sur ce type de problème.

Après un moment à galérer je suis tombé sur ce petit post : http://mikegriffin.ie/blog/20120831-accessing-mssql-with-php-on-debian-linux/ . Pour vous simplifier la vie laissez tomber pdo_odbc. ;)

PHP : Identification avec MySQL

Un nouveau screencast pour les débutants, sur l’identification et la restriction d’accès à certaines pages avec PHP et MySQL.

Les fichiers sources sont disponibles : Source : Identification PHP MySQL

A noter que j’ai changé une petite chose, l’enregistrement en session se fait dans la classe et non dans identification.php. Je vous laisser regarder les sources ;)

ERRATUM

J’ai parlé tout au long du tuto de MEDIUMINT, mais j’avais en tête SMALLINT. Du coup je rectifie ce que j’ai dit, le MEDIUMINT (5) non signé va nous permettre d’enregistrer jusqu’à 99 999 utilisateurs. Largement suffisant pour nous. Le SMALLINT (5) non signé lui nous permettrait d’enregistrer 65 535 utilisateurs, clairement suffisant aussi pour la plus grande partie des cas. Merci Olivier d’avoir mis le doigt sur cette erreur de ma part ;)

Freelance : le bon tarif journalier

Pour les freelance il est des fois délicat de se situer dans un marché où les prix peuvent fluctuer très rapidement en fonction de l’offre et de la demande. Suite à l’effet de crise le tarif des prestations à baisser au sein des SSII et il n’est pas forcément aisé de se vendre au juste prix. Pour vous aider le site freelance-info.fr vous propose une grille de tarif que je trouve à titre personnel très bien conçue. Vous pouvez y accéder via ce lien : tarifs jour de facturation des freelance. Vous y trouverez non seulement le tarif, mais également la répartition des missions par année d’expérience, et par intermédiaires. De plus pour ceux qui cherche une description précise et concise du poste qu’ils cherchent à pourvoir il y a une description pour chaque métier. Une très bonne chose pour les freelance et en plus c’est gratuit donc c’est encore mieux.

Y a site web et site web voire PHP et PHP

Depuis toujours le métier de développeur web a été plus ou moins méprisé. Ce qui revient souvent dans les conversations c’est les phrases comme « Ah mais donc en fait je peux moi aussi faire mon site web » ou « Ah vous faites pas le contenu, vous faites quoi alors ? ». Je vais donc aujourd’hui un peu éclaircir le sujet et répondre à ces questions qui ne rendent pas hommage à ceux qui travaillent durement pour vous servir.

La première chose à savoir c’est à mon sens que c’est le contenu qui fera le succès d’un site. Et les équipes qui rédigent le contenu des sites sont clairement la clé de cette réussite. Toutefois pour y parvenir il leur faut ce fameux site web, site internet, blog peu importe la forme en fin de compte. Ce qu’il faut comprendre c’est qu’un site web ce n’est pas seulement l’affichage de ces textes et images. C’est aussi tout un système qui permet de gérer ce contenu, mais qui gère également les auteurs, la mise en page, la mise en avant de certains éléments, la possibilité de changer certains éléments, de gérer des sondages, la publication du contenu en fonction des auteurs, encoder de la vidéo en flash et j’en passe. C’est une véritable suite bureautique en ligne.

Comme je viens de vous le montrer un site web ne se limite pas à l’affichage du contenu, outre la gestion des contenus on trouve également des fonctionnalités propre à chaque site, comme comparer des produits, calculer des couts de revient, souscrire à un contrat, répondre à un sondage, donner son avis sur le contenu, imprimer le contenu, publier son propre contenu un tas de fonctionnalités qui ne sont pas simplement de l’affichage de contenu mais qui demande des calculs et de la gestion de droit en fonction des utilisateurs par exemple. C’est toutes ces fonctionnalités qui permettent de faire un site internet.

Ou est ce que je veux en venir ?

C’est assez simple en fait, le métier de développeur web pourrait s’apparenter à celui de pilote de rally ou de chirurgien. En effet, si le web est accessible à tout le monde et qu’il existe des solutions clés en main pour créer son site internet nous sommes loin de ce qu’est notre métier, ou en tout cas ce qu’est le mien. Dans toute profession ou discipline il existe des niveaux. Ainsi ce n’est pas parce qu’on a le permis et qu’on sait conduire qu’on est Sebastien Loeb, de même ce n’est pas parce que l’on sais soigner une plaie ou même que qu’on a son brevet de secouriste qu’on est chirurgien. Et c’est encore plus complexe que ça il y a comptable et expert comptable, médecin et chirurgien, de même on a des intégrateurs, des développeurs et des ingénieurs au sein de notre métier. Et comme vous le savez à poste égal on a encore des différences de niveau entre les individus.

Vous devez commencer à comprendre que finalement faire des sites web ce n’est pas forcément si simple.

Je vais prendre un exemple plus concret, dans ma société (Opal CMS). Nos clients disposent d’un outils de gestion de contenu plus ou moins complet en fonction de leur besoin ça comprend la gestion de leurs documents comme des actualités à des dossiers multipages, la gestion de tous les types de médias, comme les images – avec la possibilité dans la partie administration de rechercher une image directement sur le net et de l’importer de façon transparente -, les fichiers audio, les fichiers vidéos. Pour certains ils ont la possibilité de tout simplement filmer ce qu’ils ont envie et d’envoyer le fichier sur le serveur. Notre outil transforme la vidéo en flash comme sur youtube ou dailymotion. Ils ont un système complet de workflow, c’est à dire de gestion du processus de publication, chaque utilisateur a des droits qui lui permet de signaler si son article est prêt à paraitre, alors qu’un autre utilisateur se chargera de le mettre en ligne. Certains clients ont des demandes particulières comme gérer l’import de flux RSS ou AFP de façon automatisée ou la possibilité de gérer des formules de calcul pour des applications particulières et d’autres la possibilité de gérer leurs commandes et leur stock. Je fais un peu de pub pour illustrer mon propos mais ça vous montre qu’un site internet ne se limite pas à afficher des actualités.On peut désormais utiliser le web pour gérer énormément de chose. Exemple très concret les opérateurs de téléphonie mobile gère la vente des téléphones et la souscription des contrats directement via des applications web.

Autres point important entre ce que monsieur tout le monde peut faire et ce que nous sommes amenées à faire, c’est travailler sur des applications scalable à haute performance. C’est à dire que l’application web est optimisée pour gérer beaucoup de demande, en effet entre un site personnel qui fait 10 visites par jour et des sites comme lemonde qui tourne plutôt autour du million de visites il y a une grosse différence. C’est pour ça que nous mettons en place des solutions performante et scalable, c’est à dire des solutions capable d’évoluer avec la demande qui seront capable d’être réparti sur des dizaines de serveurs de façon transparente pour le client et pour l’utilisateur sans que cela engendre des coûts pharaoniques.

Voila, vous en savez un peu plus sur ce que nous faisons ;) Rendons à César ce qui appartient à César et vive les développeurs et ingénieurs du web qui nous permettent à tous de profiter du contenu de chacun.

Oui une question ?

Pourquoi j’ai pas parlé de Google dans les applications web complexes ?

Je sais pas … :D

Bon surf ;)

Fluent interface : oui mais y’a un mais

Une des grandes “modes” du moment c’est la programmation en fluent interfaces. kézako ?

Les fluent interface sont des classes qui sont programmés de façon à ce que chaque fonction retourne $this. Oui bon on va pas chipoter mais c’est grosso modo ça y’a certes un peu plus de subtilité que ça mais si vous ne connaissez pas les fluent interface vous avez grosso modo une idée de ce que c’est.

Le but est d’obtenir un code plus lisible pour nous autres codeurs, car grâce à cette pirouette que nous permet la programmation orientée objet on peut transformer ceci:

&lt;?php
$foo = new Bar();
$foo-&gt;setParamA(0);
$foo-&gt;setParamB(‘my_string’);
$foo-&gt;execute();
?&gt;

en quelque chose de nettement plus sexy :

&lt;?php
$foo = new Bar();
$foo-&gt;setsetParamA(0)
      -&gt;setParamB(‘myString’);
      -&gt;execute();
?&gt;

C’est vachement plus simple à lire surtout quand on commence à appeler une dizaine de fonctions sur un objet.

Alors pourquoi ce billet. Pour vous mettre en garde, si cette méthode et très pratique pour nous elle l’est moins pour vos serveurs. Car sans fluent interface vous pouvez tester chaque retour de fonctions et donc vous arrêtez dès que quelque chose cloche. Avec les fluent interface vous serez obligé de passer dans tous vos tests. Alors vous me direz que je chipote et je suis entièrement d’accord.

Mais comme je pense à vous, je vous donne ma solution pour faire les choses bien comme il faut. Passez à PHP5 et utilisez les exceptions. Dès qu’une erreur bloquante pour la suite se produit vous levez une nouvelle exception. Il ne vous restera plus qu’à encadrer votre code d’un bloc “try/catch” pour faire ça tout proprement.

Comment craquer du MD5 en PHP

Et oui c’est possible avec une méthode en plus toute simple et optimisée que je viens de découvrir dans les commentaires de la doc PHP en ligne. Merci à cet utilisateur au génie incommensurable. Je ne vous fais pas languir plus longtemps.

<?php
/**
* i made a php script that can guess a hashed string’s value,
* but it takes forever with more than 2 characters in the password
*/

set_time_limit(0);
$randpass = chr(rand()).chr(rand());
print “RANDOM PASSWORD: $randpass”;
print “\n”;
$password = md5(“$randpass”);
$guesswrd = “”;
$tries = 0;
$start = microtime(true);
while($password != md5($guesswrd)){
$guesswrd = chr(rand()).chr(rand());
$tries+=1;
}
$end = microtime(true);
$time = $end-$start;
print “GUESSED PASSWORD: $guesswrd”;
print “\n”;
print “It took $tries tries and $time seconds”;
?>

Je crois que l’expression appropriée est : ROFL !

Zend-Framework 1.6 RC1

Une petite news PHP, je vais essayer de tenir un rythme régulier de publication.

Donc ca fait quelques jours que la Release Candidate 1 du Zend Framework version 1.6 est disponible. Je dois avouer que je ne suis pas un des plus grands fans du ZF pour diverses raisons, mais je dois tout de même lui conserder qu’il est très bien construit et qu’il offre une base solide pour le développement d’applications propres. On un retrouve un MVC, une couche d’abstraction de BDD (pas le meilleur à mon sens), et une multitude d’outils comme la gestion d’ACL et j’en passe. Bref c’est un bon outils.

Mais il y a un truc que je trouve marrant dans la dernière RC et ca vaut le coût de le citer. C’est le nouveau composant Zend Text. Ce composant sert à … faire de l’ASCII Art grâce aux « polices » disponibles sur FIGLet :D Non je me moque pas promis je trouve ca fendard c’est tout ;)