Maitriser le code PHP

Post on 28-Jun-2015

2.544 views 1 download

description

Comment maitriser le code PHP et en assurer une surveillance qualitative. Outils et techniques.

Transcript of Maitriser le code PHP

PHP sous contrôle Garder un oeil sur votre code source

Agenda

Industrialisation de PHP

Comment garder son code PHP sous contrôle

Techniques et outils

Organisation des équipes pour la qualité

Speaker

Damien Seguy

Nexen (.net), groupe AlterWay

Services expert et LAMP hosting

Eleveur d'éléPHPants

Stats PHP mensuelles

damien.seguy@nexen.net

Garder un oeil sur le codeSécurité

Performances

Qualité du code

Maintenance MAIS

Grosses équipes

Turnover

Longs projets

Lots of code

Avoir une référence

Listez vos règles

Diffusez-les

Gardez-les simples

"Aucun bug" n'est pas une règle

Soyez imparfaits

Suggestions de guides

Sécurité

Valider les entrées

Protégez les sorties

Qualité

Functions courtes

Pas de globales

Performances

Eviterz require(_once)

Pas de eval()

Maintenance

Nom de variables

CamelCaps ou underscores

Les mains dans le codeGrep

preg_match()

Tokenizer

Grep

Rapide, efficace, trouve toujours

Trouve d'ailleurs un peu trop

Difficile à utiliser avec de grandes structures (classes...)

Parfait quand vous savez ce que vous cherchez

Parfait avec les instructions en une ligne

Cibles pour Grep

Recherchez

$_GET, $_POST, $_COOKIE, $_SERVER, $[A-Z]

Filtrez avec les points, virgules et parenthèses

var_dump, print_r

mysqli_query, mysqli_fetch_, mysqli_error

_once

Résultats de grep804 include_once

//Variables $_GET.

$preview = !empty($_POST['preview']) ? true : false;

$server_path = !empty($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : getenv('PHP_SELF');

$_field = !empty($_GET['field']) ? $_GET['field'] : '';

eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);');

Résultats de grep

PHPboost (.com)

359 PHP files : 73201 lignes

1 fichier .lnk

1184 occurrences $_POST

555 occurrences de $_GET

1 occurrence of $_REQUEST

Regex pour PHP

perl -m

Recherches plus complexes

Sometimes easier to write as PHP

La maille du filet est un peu large

Recherche uniquement des chaînes, pas du code

Exemples de regex

Identifier les heredocs (performances)

if (preg_match_all('/<<<(\S*)(.*?)(\1)/is', $code, $r)) {

Affectations de globals (maintenance)

/=\s*\$_[A-Z]/s

Mais comment identifier une chaîne?

/'[^']*'/ ('Non, non, c\'est pas ça.';)

Stats de regex

No HereDocs

2645 SELECT

Grep en donne 7861,

y compris des fichiers .sql et des balises </select>

1059 affectations de variables entrantes $_REQUEST...

Tokenizer

Votre propre analyseur PHP

Inclus depuis PHP 4.3

Sémantique PHP exacte

Enorme liste de tokens

Doit être traité en script

Permet la modification de code

[1] => Array ( [0] => 266 [1] => print [2] => 1 )

[2] => Array ( [0] => 370 [1] => [2] => 1 )

[3] => ( [4] => " [5] => Array ( [0] => 314 [1] => hello [2] => 1 )

[6] => Array ( [0] => 309 [1] => $world [2] => 1 )

[7] => Array ( [0] => 314 [1] => ! [2] => 1 )

[8] => " [9] => ) [10] => ;

<?php print ("hello $world! "); ?>

[1] => Array ( [0] => PHP token [1] => PHP code [2] => Script line ) [2] => "

Tokenizer

Extraction de noms de variables, d'arguments, d'appels de fonctions...

$array, $array_sex, $hauteurright,

2 $_WIKI_NBR_ARTICLES_A_PAGE_IN_HISTORY

17 variables à une lettre

$is_activ, $last_member_login n'est utilisé qu'une fois

$password, $password_md5, $password_bis_md5

1981 variables distinctes

Autres pistes

VLD

Vulcan Logic Disassembler

Le tokenizer, mais en pire

xDebug

Parfait à l'éxecution

Error handler (great for PHP 4->5)

PHP est dynamique

Difficile avec les types; impose la navigation

Outils

PHP error reporting (E_STRICT)

PHP Code Sniffer (PEAR)

PHP Mess detector (PHP Unit)

phpCallGraph

Gestion des découvertesCorriger immédiatement tout est impensable

Comptez les erreurs identifiées précédemment

Toutes les nuits, à chaque commit...

Faîtes en un graphique, et agissez!

phpUnderControl (.org)

Implémentation progressive

Mettez en place votre référence

Organisez quelques tests

Mettez les en graphe, identifiez les pics

Quand vous êtes à 0 ou stable, ajoutez d'autres tests

Organisation d'équipesMise en place de revues croisées

Faites des binômes de développeurs

Chacun doit relire le code de l'autre

Tout le monde à la même référence et le même zèle

Google mondriantool

Organisation d'équipes

Distribution des revues dans l'équipe

Pas de surcharge de la hiérarchie

Un senior peut former un junior,

Bénéfice réciproque

Fonctionne même en charge

Questions?damien.seguy@nexen.nethttp://www.nexen.net/

Résultats de grep

if(isset($_POST['sgoogle'])){

// Traverse each _REQUEST data adn put them in ...

$GLOBALS['HTTP_POST_VARS'] =& $_POST;

$_REQUEST["comments_threadId"] = 0;

$game["desc"] = $_POST['description'];

$comments_t_query .= "?$c_name=" . $_REQUEST["$c_name"];

var_dump($aux);

Résultats de grep

Tiki-wiki (http://tikiwiki.org/)

1422 PHP files

456850 lignes of code

178 occurrences $_POST

7634 occurrences of $_REQUEST

56 var_dump

Stats de regex

No HereDocs

2645 SELECT

Grep en donne 7861,

y compris des fichiers .sql et des balises </select>

1059 affectations de variables entrantes $_REQUEST...

Tokenizer

Extraction de noms de variables, d'arguments, d'appels de fonctions...

61 $foo, 2 $ccc

2 $feature_community_friends_permission_dep

Toutes de $a à $z sauf $o et $q

124 variables qui ne sont utilisées qu'une fois