Si vous êtes développeur PHP, vous devez lire au moins une fois cette cinquantaine de commandements PHP !
Quelle fonction utiliser plutôt qu’une autre, comment améliorer les performances de vos scripts, les bonnes pratiques …
Ces commandements sont une traduction du billet de chez HM2K que j’ai jugé très intéressant et que je souhaite faire partager aux développeurs non anglophones.
- echo est plus rapide que print. [Citation]
- Mettre ses chaines de caractères entre simple quotes ‘…’ est plus rapide qu’entre des doubles quotes « … » car PHP analyse s’il y’a des variables entre les doubles quotes. Utiliser les simple quote pour du texte pur.
- Utiliser sprintf au lieu de mettre des variables dans des double quotes, C’est 10x plus rapide. [Citation]
- Utiliser les paramètres multiples dans un echo au lieu de la concaténation des chaines. [Citation]
- Utiliser le plus possible des variables pour les calculs, éviter de les mettre dans les boucles. Exemple
1.
<a onclick=
"window.open(this.href); return false;"
href=
"http://www.php.net/for"
>
for
</a> (
$x
=0;
$x
<
count
(
$array
);
$x
)
La fonction count est appelée à chaque boucle, mieux vaut utiliser $max=count($array) pour stocker le résultat du calcul avant la boucle. [Citation]
- Pensez à unset ou rendre null vos variables, en particulier les gros tableaux. [Citation]
- Eviter les méthodes magiques comme __get, __set, __autoload. [Citation]
- Utiliser require() au lieu de require_once() quand c’est possible. [Citation]
- Utilisez desz chemins complets dans vos include et require. C’est du temps gagné pour la résolution du chemin au niveau de votre OS. [Citation]
- require() et include() sont identiques à part que require arrete le script si le fichier n’est pas trouvé. Les performances sont quasi identiques. [Citation]
- Depuis PHP5, l’heure de démarrage d’un script peut être trouvé grâce à $_SERVER[’REQUEST_TIME’], à utiliser à la place de time() ou microtime(). [Citation]
- PCRE regex est plus rapide que EREG, mais il faut toujours regarder s’il n’est pas posssible d’utiliser une fonction native comme strncasecmp, strpbrk et stripos à la place. [Citation]
- Quand vous parsez du XML en PHP essayez xml2array, qui permet d’utiliser les fonctions PHP XML, pour du HTML vous pouvez essayer DOM document ou DOM XML en PHP4. [Citation]
- str_replace est plus rapide que preg_replace, str_replace est globalement le meilleur dans tous les cas, même si quelques fois strtr est plus rapide avec des chaines longues. Utiliser un array() dans str_replace est plus rapide que d’utiliser plusieurs str_replace. [Citation]
- “else if” est plus rapide qu’un case/switch. [Citation]
- La suppression d’erreurs avec @ est très lent. [Citation]
- Pour réduire l’utilisation de la bande passante, il faut activer le mode mod_deflate dans Apache2 [Citation] ou mod_gzip pour Apache1. [Citation]
- Fermer les connexions aux BDD après les avoir utilisé. [Citation]
- $row[’id’] est 7 fois plus rapide que $row[id], car si vous ne mettez pas les quotes, PHP Pense qu’il va s’agir d’une constante. [Citation]
- L’utilisation de tags d’un autre style ou des shorts tags pour ouvrir du code PHP est déconseillé. [Citation]
- L’utilisation d’un code strict permettant de supprimer toutes les erreurs, warning etc est conseillé. error_reporting(E_ALL) doit toujours être activé. [Citation]
- Les scripts PHP sont rendus 2 à 10 fois moins rapidement par Apache qu’une page statique. Essayez d’utiliser au maximum des pages statiques. [Citation]
- Les scripts PHP sont compilés à la volée (si pas de cache). Installez un système de cache PHP (comme memcached, eAccelerator ou Turck MMCache) permet d’augmenter de 25-100% les performances. [Citation]
- Une alternative aux systèmes de cache est de générer régulièrement le rendu en HTML statique. Essayez Smarty ou Cache Lite. [Citation]
- Utilisez isset où c’est possible au lieu de strlen. (ie: if (strlen($foo) < 5) { echo “Foo is too short”; } vs. if (!isset($foo{5})) { echo “Foo is too short”; } ). [Citation]
- ++$i est plus rapide que $ i++, donc utilisez le pre-increment quand c’est possible. [Citation]
- Ne réinventez pas la roue, utilisez les fonctions natives de PHP qui seront toujouts plus rapides; Si vous avez le temps de réecrire, faites le sous forme de modules C / C++. [Citation]
- Analysez votre code (Profiler). Utilisez Xdebug debugger pour profilker du code PHP. [Citation]
- Documentez votre code. [Citation]
- Apprenez les différences entre du bon et du mauvais code. [Citation]
- Utilisez les standarts pour une meilleure compréhension de votre code par les autres. [Citation]
- Séparez les couches: Contenu, PHP et HTML. HTML dans un autre fichier que le PHP. [Citation]
- IL n’est pas obligatoire d’utiliser des systèmes de templates complexes comme Smarty, PHP en intègre déjà, regardez ob_get_contents et extract. [Citation]
- Ne jamais avoir confiance en les variables utilisateurs: $_POST et $_GET. Utilisez mysql_real_escape_string quand vous utilisez MySQL, et htmlspecialchars quand vous rendez du HTML. [Citation]
- Pour des raisons de sécurité, ne dévoillez jamais d’infos concernant vos paths, extensions et configuration, comme utiliser display_errors ou phpinfo(). [Citation]
- Désactivez register_globals (Normalement désactivé par défaut, pas pour rien!). L’utiliser = risque de sécurité. Bientôt, le PHP6 supprimera complètement cette fonction ! [Citation]
- Ne jamais utiliser du texte clair pour stocker les mots de passe ou les comparer. Utilisez un hash md5 au minimum. [Citation]
- Utilisez ip2long() et long2ip() pour stocker les adresses IP en INT plutôt qu’en STRING. [Citation]
- Pour ne pas réinventer la roue, vous pouvez utiliser les nombreux projets PEAR souvent standarts. [Citation]
- Quand vous utilisez header(’Location: ‘.$url); n’oubliez pas d’y faire suivre un die(); car le script continue de tourner même après l’instruction. [Citation]
- En POO, si une méthode peut être static, alors déclarez la en static. Elle sera 4 fois plus rapide. [Citation].
- Incrémenter une variable locale dans une méthode POO est le plus rapide. [Citation]
- Incrémenter une propriété d’un objet (eg. $this->prop++) est 3 fois plus lent qu’une variable locale. [Citation]
- Incrémenter une variable indéfinie est 9-10 fois plus lent qu’une variable pré définie. [Citation]
- Déclarer une variable globale dans une fonction sans l’utiliser ralenti les choses. PHP doit faire une sorte de check sur la variable pour vérifier qu’elle existe. [Citation]
- Le nombre de méthodes dans une classe ne change rien aux performances d’appel d’une méthode. [Citation]
- Les méthodes d’une classe dérivée vont plus vite que celles de la classe mère. [Citation]
- Une fonction appelée avec un ou zéro paramètre prend environ 7-8 fois un $localvar++. 15 $localvar++ pour l’appel d’une méthode similaire. [Citation]
- Tout ne doit pas être objet, chaque méthode et propriété consomme de la mémoire. [Citation]
- Echappez les chaines provenant de l’extérieur avec mysql_real_escape_string, au lieu de mysql_escape_string ou addslashes. Si magic_quotes_gpc est activé, mieux vaut utiliser stripslashes en premier. [Citation]
- Attention lors de l’utilisation de mail() et de ses headers, il y’a des failles de sécurité. [Citation]
- Il faut unset les variables que l’on ne se sert plus après s’être connecté à la BDD
Vous n’avez plus qu’à respecter tout ces conseils pour avoir un code PHP optimisé !