Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 22-12-2012 17:49:36

imsouf
Membre
Date d'inscription: 19-12-2012
Messages: 12

Performance du classmap

Bonjour,

par simple curiosité, je m'interroge sur les performances offertes par l'utilisation ou non du classmap.

Et ce que quelqu'un aurait des chiffres ?

Hors ligne

 

#2 27-12-2012 21:39:48

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Performance du classmap

Aucune idée mais le classmap évite d'avoir à rechercher un fichier en fonction de son namespace la relation "position sur le disque" <=> "namespace" est déjà faite donc ça va forcément plus vite tu gagnes certains accès disque.

Hors ligne

 

#3 27-12-2012 22:45:47

Bouks
Membre
Lieu: Paris
Date d'inscription: 31-08-2012
Messages: 241

Re: Performance du classmap

Il y a quand même un truc qui me chiffonne avec le classmap.

Par définition, un namespace php peut être éclaté en plusieurs endroits de l'arborescence.

Ceci dit, si on suit des règles qui font qu'un namespace n'est pas éclaté et qu'on suit scrupuleusement l'ordonnancement namespace <-> position dans l'arborescence des fichiers (et pas sur le disque wink ), alors pourquoi n'y pas définir juste l'emplacement des namespaces 'racines' au lieu de toutes les classes.

Chercher dans un tableau est-il plus rapide que d'assembler des strings, et si gain de temps il y a, n'est-il pas dérisoire  ?


22914720

Hors ligne

 

#4 02-01-2013 12:59:11

imsouf
Membre
Date d'inscription: 19-12-2012
Messages: 12

Re: Performance du classmap

Bouks, je pense que s'il faut renseigner toute la class et non pas seulement le namespace racine, je pense que c'est comme le dit Orkin, pour éviter les opérations sur le système de fichier.

Car, j'ai testé, une class qu'on a définie dans le classmap sera require() directement lorsqu'elle sera appelée, sans regarder préalablement si le fichier existe (si le fichier n'existe pas on a une belle erreur de require impossible).
Au contraire si on appelle une class incorrecte sans passer par un classmap, on obtient non pas une erreur de require, mais une erreur de class inexistante.
En passant par le classmap on évite d'utiliser file_exists() (ou autre chose du genre), après est-ce que le gain de performance est notable ? C'est là ma question :p

Comme je débute tout juste sur Zend je n'ai pas de grosse application avec plein de classes pour tester l'impacte !

Hors ligne

 

#5 04-01-2013 10:56:48

manuclin
Nouveau membre
Date d'inscription: 13-02-2012
Messages: 5

Re: Performance du classmap

Bonjour Imsouf,

Je viens de retrouver un article répondant partiellement à ta question :

http://samminds.com/2012/11/zf2-perform … toloading/


Bonne année à tous
Pace e Salute a tutti

Dernière modification par manuclin (04-01-2013 11:26:36)

Hors ligne

 

#6 14-01-2013 01:02:26

jmleroux
Membre
Lieu: Nantes
Date d'inscription: 14-11-2012
Messages: 32
Site web

Re: Performance du classmap

Bonsoir,

L'utilisation de classmap est beaucoup plus performante : require direct comme le dit imsouf au lieu d'une recherche de la classe dans le filesystem.
C'est d'ailleurs la méthode à préconiser pour un gros site, et il y a même un classmap_generator livré avec zf2 quand tu l'installes via composer. Voir le répertoire vendor/bin.

Hors ligne

 

#7 21-01-2013 16:13:49

irumi
Membre
Date d'inscription: 29-04-2011
Messages: 47

Re: Performance du classmap

Bonjour, justement en parlant du classmap_generator livré avec ZF2. Comment faire pour auto-load zf2 car utiliser les 'use Zend\...' tous le temps c'est asser lourd.
Je débute avec Zend 2 et je ne sait pas trop ou charger mon fichier 'autoload_classmap.php' contenant les chemin du framwork.

Hors ligne

 

#8 21-01-2013 16:48:09

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Performance du classmap

Salut, j'ai pas trop compris ta question mais tu es obligé de mettre les namespaces des classes que tu utilises smile

Hors ligne

 

#9 21-01-2013 17:02:31

irumi
Membre
Date d'inscription: 29-04-2011
Messages: 47

Re: Performance du classmap

Je me doutait que ce n'était pas très claire.

Par exemple dans mon controlleur qui gère l'authentification je suis obliger d'écrire en haut :

Code:

use Zend\ModuleManager\Feature\BootstrapListenerInterface;
use Zend\Authentication\AuthenticationService;
use Zend\Authentication\Adapter\DbTable as AuthAdapter;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

Et sur chaque controller ou je veut récupérer l'identité de mon visiteur je doit écrire 'use Zend\Authentication\AuthenticationService;'

Ce que j'aimerais c'est autoload les classe de zf2 et non devoir les inclure à chaque controller. par exemple faire directement  :
$auth = new Zend\Authentication\AuthenticationService();
au lieu d'inclure le fichier et ensuite devoir faire :
$auth = new AuthenticationService()

Donc j'ai bien générer un fichier autoload_classmap.php de la library zf2 via le 'classmap_generator' mais je ne trouve pas l'inclure dans mon projet.

Hors ligne

 

#10 21-01-2013 17:07:09

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Performance du classmap

Tu peux utiliser le service manager pour l'authentication service ce qui t'évite d'avoir à l'importer mais c'est quelque part l’inconvénient des namespaces. Personnellement ça ne me gène pas moi qui vient du monde java on doit importer toutes les classes (bon j'avoue éclipse le fait tout seul mais bon). Sinon tu peux faire un contrôleur parent qui contient ces import.

Pour ta question j'en ai aucune idée big_smile

Hors ligne

 

#11 21-01-2013 17:09:47

J0r
Membre
Date d'inscription: 27-04-2012
Messages: 57

Re: Performance du classmap

Si tu fais ça c'est bon pas besoin d'inclure le fichier

$auth = new \Zend\Authentication\AuthenticationService();

Dernière modification par J0r (21-01-2013 17:10:10)

Hors ligne

 

#12 21-01-2013 17:26:02

irumi
Membre
Date d'inscription: 29-04-2011
Messages: 47

Re: Performance du classmap

Orkin => merci pour la réponse. Je trouve domage de perdre en temps de développement pour améliorer les performances de l'application. Je vais quand même continuer de chercher une solution .

J0r => si je fait ça, j'ai l'erreur suivante :

Code:

Fatal error: Class 'Admin\Controller\Zend\Authentication\AuthenticationService' not found in /var/www/site/module/Admin/src/Admin/Controller/IndexController.php on line 27

ma ligne 27 est bien évidement : $auth = new Zend\Authentication\AuthenticationService();

Hors ligne

 

#13 21-01-2013 17:53:59

irumi
Membre
Date d'inscription: 29-04-2011
Messages: 47

Re: Performance du classmap

En faite, concrètement, je croie avoir un souci avec le 'Zend\Loader\ClassMapAutoloader' car si je retire son contenu, cela ne change rien....

Hors ligne

 

#14 22-01-2013 09:23:08

jmleroux
Membre
Lieu: Nantes
Date d'inscription: 14-11-2012
Messages: 32
Site web

Re: Performance du classmap

irumi a écrit:

Ce que j'aimerais c'est autoload les classe de zf2 et non devoir les inclure à chaque controller. par exemple faire directement  :
$auth = new Zend\Authentication\AuthenticationService();
au lieu d'inclure le fichier et ensuite devoir faire :
$auth = new AuthenticationService()

Le mot clé "use" n'a pas grand chose à voir avec l'autoload.
C'est juste un moyen de raccourcir les noms de classes dans le code.

Ne pas confondre "use" et "require", c'est complètement différent.

Hors ligne

 

#15 22-01-2013 18:50:48

irumi
Membre
Date d'inscription: 29-04-2011
Messages: 47

Re: Performance du classmap

Je croyais qu'en plus de raccourcire les noms, je croyait que ça permettait d'indiquer ou était les fichier de classe.
Du coup, je ne comprend pas pourquoi je peut pas instancier mes objet comme ça :

$auth = new Zend\Authentication\AuthenticationService();

plutôt que de faire :
use Zend\Authentication\AuthenticationService;
$auth = new AuthenticationService();

j'ai l'impression que c'est a cause du namespace déclarer pour le controller : namespace Admin\Controller;

Du coup il cherche Admin\Controller\Zend\Authentication\AuthenticationService ...
Bizard tous ça

Hors ligne

 

#16 22-01-2013 18:56:03

jmleroux
Membre
Lieu: Nantes
Date d'inscription: 14-11-2012
Messages: 32
Site web

Re: Performance du classmap

Il te manque le backslash du début

$auth = new \Zend\Authentication\AuthenticationService();

Sinon, c'est une recherche relative.
Cela n'est pas spécifique à ZF, je te conseille de relire la doc sur les namespaces.

http://php.net/manual/fr/language.namespaces.php

Hors ligne

 

#17 22-01-2013 19:33:07

irumi
Membre
Date d'inscription: 29-04-2011
Messages: 47

Re: Performance du classmap

Merci pour l'info. je vais regarder tous ça de près. Je n'avais jamais utilisé les namespaces avant.

Hors ligne

 

#18 23-01-2013 08:45:47

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Performance du classmap

Salut Irumi, je sais pas si tu as fait un peu de java avant mais les namespace ça correspond au packages des classes (je sais pas si ça pourra t'aider).
Sinon autre moyen simple le FQCN (Full Qualified Class Name (nom complet de la classe ça comprend son namespace + le nom de la classe).

En fait l'autoloader ça permet d'éviter au moteur PHP de parcourir le disque pour trouver une classe en fonction de son namespace puisque l'alias namespace => chemin sur le disque est renseigné dans le fichier d'autoload, php va directement chercher le fichier au bon endroit. On a un petit gain de temps pour une classe et donc pour plusieurs centaines ou milliers de classes c'est significatif.

Hors ligne

 

#19 23-01-2013 13:30:40

irumi
Membre
Date d'inscription: 29-04-2011
Messages: 47

Re: Performance du classmap

Merci pour les infos, oui j'ai fait un peut de java mais en fait c'est le \ qui me manquait (je ne crois pas l'avoir déjà fait en java).

En tous cas c'est sur que c'est pratique que les IDE ajoute les classe automatiquement en java.

Encore merci

Hors ligne

 

#20 23-01-2013 14:00:17

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Performance du classmap

Certains IDE le font aussi pour PHP notamment netbeans et phpstorm. En java tu ne mets pas le \ c'est une autre notation avec des . mais le principe reste le même. Le \ du début est nécessaire que lorsque tu es dans la classe car il permet indique de ne pas tenir compte du namespace de la classe dans laquelle se trouve l'appel. Lorsque tu fais le use tu n'es pas encore dans la classe (même si tu es dans le fichier) donc pas besoin du \.

Exemple :

Code:

[lang=php]use Zend\Mon\Package\Ma\Classe;

class MaClasseDeux {

public function maFonction() {
$mavar = new \Zend\MonPackage\Ma\Classe(); // Si pas de use
$mavar = new Classe(); // Si use
}
}

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages