maitriser le code php
Post on 28-Jun-2015
2.546 Views
Preview:
DESCRIPTION
TRANSCRIPT
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
top related