maitriser le code php

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

Upload: damien-seguy-

Post on 28-Jun-2015

2.544 views

Category:

Technology


1 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Maitriser le code PHP

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

Page 2: Maitriser le code PHP

Agenda

Industrialisation de PHP

Comment garder son code PHP sous contrôle

Techniques et outils

Organisation des équipes pour la qualité

Page 3: Maitriser le code PHP

Speaker

Damien Seguy

Nexen (.net), groupe AlterWay

Services expert et LAMP hosting

Eleveur d'éléPHPants

Stats PHP mensuelles

[email protected]

Page 4: Maitriser le code PHP

Garder un oeil sur le codeSécurité

Performances

Qualité du code

Maintenance MAIS

Grosses équipes

Turnover

Longs projets

Lots of code

Page 5: Maitriser le code PHP

Avoir une référence

Listez vos règles

Diffusez-les

Gardez-les simples

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

Soyez imparfaits

Page 6: Maitriser le code PHP

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

Page 7: Maitriser le code PHP

Les mains dans le codeGrep

preg_match()

Tokenizer

Page 8: Maitriser le code PHP

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

Page 9: Maitriser le code PHP

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

Page 10: Maitriser le code PHP

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);');

Page 11: Maitriser le code PHP

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

Page 12: Maitriser le code PHP

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

Page 13: Maitriser le code PHP

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.';)

Page 14: Maitriser le code PHP

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...

Page 15: Maitriser le code PHP

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

Page 16: Maitriser le code PHP

[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] => "

Page 17: Maitriser le code PHP

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

Page 18: Maitriser le code PHP

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

Page 19: Maitriser le code PHP

Outils

PHP error reporting (E_STRICT)

PHP Code Sniffer (PEAR)

PHP Mess detector (PHP Unit)

phpCallGraph

Page 20: Maitriser le code PHP

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)

Page 21: Maitriser le code PHP

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

Page 22: Maitriser le code PHP

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

Page 23: Maitriser le code PHP

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

Page 24: Maitriser le code PHP

[email protected]://www.nexen.net/

Page 25: Maitriser le code PHP
Page 26: Maitriser le code PHP

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);

Page 27: Maitriser le code PHP

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

Page 28: Maitriser le code PHP

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...

Page 29: Maitriser le code PHP

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