maitriser le code php
DESCRIPTION
Comment maitriser le code PHP et en assurer une surveillance qualitative. Outils et techniques.TRANSCRIPT
![Page 1: Maitriser le code PHP](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/1.jpg)
PHP sous contrôle Garder un oeil sur votre code source
![Page 2: Maitriser le code PHP](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/2.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/3.jpg)
Speaker
Damien Seguy
Nexen (.net), groupe AlterWay
Services expert et LAMP hosting
Eleveur d'éléPHPants
Stats PHP mensuelles
![Page 4: Maitriser le code PHP](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/4.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/5.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/6.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/7.jpg)
Les mains dans le codeGrep
preg_match()
Tokenizer
![Page 8: Maitriser le code PHP](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/8.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/9.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/10.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/11.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/12.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/13.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/14.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/15.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/16.jpg)
[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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/17.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/18.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/19.jpg)
Outils
PHP error reporting (E_STRICT)
PHP Code Sniffer (PEAR)
PHP Mess detector (PHP Unit)
phpCallGraph
![Page 20: Maitriser le code PHP](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/20.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/21.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/22.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/23.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/24.jpg)
[email protected]://www.nexen.net/
![Page 25: Maitriser le code PHP](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/25.jpg)
![Page 26: Maitriser le code PHP](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/26.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/27.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/28.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022052214/558fd9291a28ab87528b457a/html5/thumbnails/29.jpg)
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