12
2010
Optimiser Zend – Partie 1
Cela fait un moment que je ne vous ai pas refait de tutoriaux pour le Framework Zend. Aujourd’hui je vous propose une adaptation d’un tutoriel en anglais que l’on m’avait fait parvenir et qui m’a grandement aidé (malheureusement, il n’est plus sur la toile).
Vous savez comme moi que l’un des points faibles de Zend Framework, c’est la performance, il est beaucoup plus lent que du PHP objet de base du fait de la majeur partie des classes qui sont chargées lors du lancement d’une page. Je vais donc réaliser ce tutoriel en plusieurs parties.
Aujourd’hui, je vais juste vous expliquer comment diminuer les chargements inutiles et redéfinir le fichier d’amorçage (le fameux index.php). Vous vous souvenez tous comment est composé le fichier index.php ? Et bien voici un petit rappel pour ceux qui ne savent pas :
| PHP | | copy code | | ? |
| 01 | /** |
| 02 | * Fichier index.php permettant de lancer le bootstrap |
| 03 | * |
| 04 | */ |
| 05 | |
| 06 | //Définition du chemin vers le dossier application |
| 07 | defined('APPLICATION_PATH') |
| 08 | || define('APPLICATION_PATH', |
| 09 | realpath(dirname(__FILE__) . '/../application')); |
| 10 | |
| 11 | //Définition de la variable de d'application (utile pour les fichiers de configuration |
| 12 | defined('APPLICATION_ENV') |
| 13 | || define('APPLICATION_ENV', |
| 14 | (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') |
| 15 | : 'production')); |
| 16 | |
| 17 | //Partie permettant d'inclure les différentes librairies |
| 18 | //du dossier library (en théorie). |
| 19 | //Nécessite un complément côté bootstrap. |
| 20 | set_include_path(implode(PATH_SEPARATOR, array( |
| 21 | dirname(dirname(__FILE__)) . '/library', |
| 22 | get_include_path(), |
| 23 | ))); |
| 24 | |
| 25 | /** Zend_Application */ |
| 26 | require_once 'Zend/Application.php'; |
| 27 | |
| 28 | // Créer l'application, le bootstrap et démarre |
| 29 | $application = new Zend_Application( |
| 30 | APPLICATION_ENV, |
| 31 | APPLICATION_PATH . '/configurations/app.ini' |
| 32 | ); |
| 33 | $application->bootstrap() |
| 34 | ->run(); |
| 35 |
Nous allons juste ajouter une petite partie permettant d’inclure plus rapidement les classes de Zend en repassant par Zend_Autoloader et nous redéfinirons sa méthode d’inclusion. Voici donc le nouveau index.php qui vous parlera mieux que mes explications :
| PHP | | copy code | | ? |
| 01 | // Define path to application directory |
| 02 | defined('APPLICATION_PATH') |
| 03 | || define('APPLICATION_PATH', |
| 04 | realpath(dirname(__FILE__) . '/../application')); |
| 05 | |
| 06 | // Define application environment |
| 07 | defined('APPLICATION_ENV') |
| 08 | || define('APPLICATION_ENV', |
| 09 | (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') |
| 10 | : 'production')); |
| 11 | |
| 12 | // Typically, you will also want to add your library/ directory |
| 13 | // to the include_path, particularly if it contains your ZF install |
| 14 | set_include_path(implode(PATH_SEPARATOR, array( |
| 15 | dirname(dirname(__FILE__)) . '/library', |
| 16 | get_include_path(), |
| 17 | ))); |
| 18 | |
| 19 | //redéfinition de l'autoloader par défaut afin d'optimiser le chargement |
| 20 | require_once 'Zend/Loader/Autoloader.php'; |
| 21 | $autoloader = Zend_Loader_Autoloader::getInstance(); |
| 22 | $autoloader->setDefaultAutoloader(create_function('$class', |
| 23 | "include str_replace('_', '/', \$class) . '.php';" |
| 24 | )); |
| 25 | |
| 26 | /** Zend_Application */ |
| 27 | //require_once 'Zend/Application.php'; |
| 28 | |
| 29 | // Create application, bootstrap, and run |
| 30 | $application = new Zend_Application( |
| 31 | APPLICATION_ENV, |
| 32 | APPLICATION_PATH . '/configurations/app.ini' |
| 33 | ); |
| 34 | $application->bootstrap() |
| 35 | ->run(); |
Cette partie ne suffit pas, pour gagner encore du temps, je vous invite à suivre le conseil donné par l’équipe Zend en fin de documentation, à savoir, supprimer tous les require_once inutiles de la bibliothèque Zend. (je vous invite aussi à les enlever de vos controller, formulaires, …).
En effet, pour chaque require_once, le serveur va effectuer des accès disque et c’est ces accès disques qui ralentissent le serveur. La méthode est donc de les enlever et ensuite, notre redéfinition faite dans le index.php prendra le relais, elle effectuera tardivement le chargement de tous les fichiers nécessaires afin d’optimiser le chzrgement de nos classes. La documentation Zend explique mieux que moi cette partie:
Le chargement tardif (« lazy loading ») est une technique d’optimisation conçue pour repousser l’opération coûteuse de chargement d’une classe jusqu’au dernier moment possible – c’est-à-dire lors de l’instanciation d’un objet de cette classe, ou lors de l’utilisation d’une constante de classe ou d’une propriété statique. PHP supporte tout ceci via l’autoloading (ou « chargement automatique »), ce qui vous permet de définir un ou plusieurs callbacks à exécuter dans le but de faire correspondre un nom de classe à un fichier.
Cependant, la plupart des avantages que vous pourrez retirer de l’autoloading sont diminués si le code de votre librairie exécute toujours des appels à require_once – ce qui est précisément le cas de Zend Framework. La question est donc : comment éliminer ces déclarations require_once dans le but de maximiser les performances de l’autoloader.
Pour ce faire, il ne vous suffit que d’exécuter cette commande sous Linux (je rajouterai celle sous Windows et FreeBSD quand je les aurais retrouvé) :
| Bash | | copy code | | ? |
| 1 | % cd chemin/vers/la/librarie/ZendFramework |
| 2 | % find . -name '*.php' -not -wholename '*/Loader/Autoloader.php' \ |
| 3 | -not -wholename '*/Application.php' -print0 | \ |
| 4 | xargs -0 sed --regexp-extended --in-place 's/(require_once)/\/\/ \1/g' |
Pour finir, nous définissons une nouvelle fonction dans notre Bootstrap principal afin que lui aussi tire parti de ces changements :
| PHP | | copy code | | ? |
| 1 | public static function autoload($class) |
| 2 | { |
| 3 | include str_replace('_', '/', $class) . '.php'; |
| 4 | return $class; |
| 5 | } |
Voilà, après ces quelques modifications, votre site devrait se charger un poil plus vite et consommer moins de mémoires.
Dans la seconde partie, je vous expliquerai comment créer une méthode qui mesure la charge mémoire de chacune de vos pages. Si vous avez des questions, des remarques, des critiques ou même des corrections, n’hésitez pas à me les faire parvenir.
Articles Connexes
4 Commentaires Donnez votre avis
Laisser un commentaire
Catégories
- Actualités (11)
- Android (5)
- Bases de Données (4)
- Développement (1)
- PasteQR (2)
- PHP (8)
- Systèmes et Réseau (5)
- Technologies Web (5)
- Tests (2)
- Zend Framework (30)
Commentaires récents
- (@Fritte7) (@Fritte7) dans PasteQR passe en 1.1.0
- roux dans ZendX Jquery Dialog
- Fritte7 dans Gérer des évènements dans une listview.
- Fierfeu dans Introduction à Zend Framework 2.0
- Christophe B. dans Gérer des évènements dans une listview.
Mots-Clefs
Active Directory AJAX Android Apache2 APC Bootstrap Chrome Configuration CSS Eclipse Firefox Google html HTTP Installation Internet Internet Exporer Java Javascript JQuery JQuery UI Linux Mémoire Mac MySQL Navigateur Opera PDO Pear Phing PHP Safari SGBD SMTP SQL Ubuntu View Helper Windows Server XML Zend Cache Zend DB Zend Form Zend Framework ZendX ZF 2.0
WP Cumulus Flash tag cloud by Roy Tanck requires Flash Player 9 or better.

Publié par Throrïn





Bonjour, vos tuto sur Zend m’aide beaucoup, avez vous trouver la commande a effectuer sous console windows?svp
Merci d’avance
Bonjour, les commandes Zend sont identiques sur windows comme sur linux mais je préfère créer mes projets manuellement .
ah mais je ne parlais pas de la commandes zf mais de ce bout de code la :
% cd chemin/vers/la/librarie/ZendFramework
% find . -name ‘*.php’ -not -wholename ‘*/Loader/Autoloader.php’ \
-not -wholename ‘*/Application.php’ -print0 | \
xargs -0 sed –regexp-extended –in-place ‘s/(require_once)/\/\/ \1/g’
afin d’épurer le temps de chargement des pages zend
Désolé, je n’ai pas l’équivalent Windows pour cette commande. Je regarde si je la trouve et je vous la remettrai ici