20. Essayez d'estimer le coût de développement vs. coûtmatériel : parfoisc'est moins cherd'ajouter de la mémoire viveQuand faut-il optimiser ?
21.
22. Charge serveur: ab, siege, multi-mechanize ... Charge de la base de donnée: MySql Slow Query Log, mysql proxy, ... EXPLAIN PHP: xdebug, dbg, xhprof ... Network / client side Yslow, Firebug, WebKitinspector, dynaTrace AJAX, fiddler, Google webmaster tools Comment mesurer ?
23.
24. Ramdisk pour les fichierssouventappelés (frameworks, configuration, tmp) Le point généralement critique: I/O (filesystem, dbs) Amélioration de l’infrastructure
27. Debian+ Apache 1.3 (hébergement mutualisé, nfs):Système de fichiers # Files Glob('*') exec. in sec. file_exists / sec. 1000 4,59 36000 11000 13,30 21000 65000 55,81 1475 122000 142,16 718
28. Fractionnement du contenu des répertoires img/p/534-189-small.jpg devient img/p/small/534-189.jpg Lecture transparente avec un .htaccess RewriteRule (.*)/p/([^/]*)homejpg $1/p/home/$2home.jpg Ecriture transparente en php if (!imageResize($file, $dir.$imageType['name'].'/'.$language['iso_code'].'-default- '.stripslashes($imageType['name']).'.jpg', ... Solution
29.
30. Attention aux jointures!SELECT * FROM ps_feature` f LEFT JOIN ps_feature_lang` fl ON ( f.`id_feature` = fl.`id_feature` AND fl.`id_lang` = 1) WHERE f.`id_feature` = 1SELECT * FROM ps_feature_lang` fl WHER fl.`id_feature` = 1 AND fl.`id_lang` = 1 Version Tables Columns Without index 1.1.0.5 88 458 50 1.2.0.5 134 670 50 1.3.10 135 679 2 (cool! :)
31. Utilisez des VIEWs à la place de SELECTs compliqués Avezvousbesoin de ps_connections& ps_connections_page? Si vousavez un traficconséquent, celles-cipeuventgrossir de plus de 10+ Mb / jour Base de donnée
39. static public function getCurrency($id_currency){ return Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.'currency` WHERE `deleted` = 0 AND `id_currency` = '.intval($id_currency)); } static public functiongetCurrency($id_currency){ if (!isset(self::$_cache[$id_currency])) { self::$_cache[$id_currency] = Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.'currency` WHERE `deleted` = 0 AND `id_currency` = '.intval($id_currency)); } return self::$_cache[$id_currency]; } Cache local
49. foreach($cart->getProducts() as $product) if ($orderStatus->logable) ProductSale::addProductSale(intval($product['id_product']), intval($product['cart_quantity'])); Devraitêtre: if ($orderStatus->logable) foreach($cart->getProducts() as $product) ProductSale::addProductSale(intval($product['id_product']), intval($product['cart_quantity'])); (pas utile de tester le if à chaqueitérations'iln'y a pas de changement) Bien placer les conditions
52. Ici, on prépare tout l'envoi du mail avec le pdf en pièce jointemêmesi on ne l'envoie pas. “Every times you do it, a little kitten dies” Conditions non optimisés
65. Utilisez le cache (mod_expires, Etags) pour les fichiersstatiquescomme les imagesVouspouvez le faire dans un .htaccessoudanshttpd.conf ExpiresActiveOn ExpiresDefault"access plus 15 days“ ExpiresByTypeimage/gif A2592000 Réseau
71. Permet d’intéragir avec la base de donnée Sécuriseztoutesvos variables avantl’utilisationdans des requêtes SQL!<?php ...... $order_detail = Db::getInstance()->ExecuteS(' SELECT * FROM .'_DB_PREFIX_.'order_detail WHERE id_order='.(int)$_GET['id_order'] AND payment=apos;'.pSQL($_GET['payment']).'apos;'); Injection SQL
72. Exploite votre identité auprès de votre site Utilisez des tokens Utilisezuneauthentificationdans les paramètres GET ou POST index.php?tab=AdminOrders&token=e84b3fda0b04b922b3bc27b08d4fe136 CSRF
73. Injection de code HTML / JavaScript dans la page Sécuriseztoutesvos variables avantl’affichage! <input type="text" name="lastname" value="{$smarty.post.lastname|htmlentities}" /> preg_replace('/.*script/ui', '', $_POST['lastname']); preg_replace('/.*onmousedown|onmousemove|onmmouseup|onmouseover|onmouseout|onload|onunload|onfocus|onblur|onchange|onsubmit|ondblclick|onclick|onkeydown|onkeyup|onkeypress|onmouseenter|onmouseleave/ui', '', $_POST['lastname']); ... XSS
74. Accès à des données non autorisées Sécuriseztoutesvos variables avant de charger le fichier Vérifiezl’extention du fichier include (dirname(__FILE__).'/mails/'. preg_replace(‘/{2,}/', '.', Tools::getValue('mail')).'html'); Path transversal