Performance et require_once

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Performance et require_once

par x@v » 18 avr. 2008, 15:08

C'est vrai que l'accessibilité n'y est pas mais en java il est rare de l'utilisez on se contente du public ou package, après si on imagine sortir du web sa peux être rébarbatif.
En java ont peux aussi avoir plusieurs classe mais une convention pérrenne nous l'interdit, ont le voit dans des documents didactiques.
J'ajoute qu'un nom similaire aussi n'est pas obligé mais eclipse le gère mal, netBean je ne sais pas.
Pour le lien effectivement chez Pear on a des pistes, ce qui est bien c'est que sa s'inspire fortement de Java, enfin pour moi qui ai les bases.

par Hywan » 18 avr. 2008, 11:20

La gestion des paquetages dans PHP est plus libre que dans Java. Le nom des fichiers est indépendant du nom des classes qu'il contient car à l'origine, PHP n'avait pas d'objet. Aujourd'hui il mélange le fonctionnel, l'objet etc., donc on ne peut pas imposer de telles normes (sans voir arriver un tsunami de personnes en détresses sur ce forum ;-)).
On n'a toujours pas cette notion de classe privée ou restreinte en PHP que l'on retrouve en Java. Tu peux également avoir plusieurs classes dans un même fichier. On peut aussi très bien imaginer un objet avec des méthodes statiques et des fonctions alias vers ces méthodes statiques, le tout dans un même fichier. C'est très souple et très puissant, mais il faut avoir de la rigueur.

En revanche, si tu utilises les bonnes normes et codages, tu peux utiliser de façon très intelligente ta méthode __autoload. C'est à dire découper le nom de la classe à instancier pour retracer le chemin et l'inclure. Tu retrouveras ainsi un comportement similaire au paquetage Java.

Justement, il y a un sujet en ce moment avec des liens intéressants sur les normes et conventions de codage. Tu devrais trouver tout ce qu'il te faut là-dedans :).

par x@v » 18 avr. 2008, 10:22

en faite en java on fait justement comme ça, je veux dire une classe porte toujours le nom du fichier.
Ce n'est pas l'esprit de php ?
Y-a-t'il un lien sur le sujet :?:

par Sékiltoyai » 18 avr. 2008, 01:58

Tu la déclares une seule fois, dans le fichier principal, à chaque fois qu'une classe inexistante sera appelée, cette fonction sera appelée avec en argument le nom de la classe à charger. Ton but est alors d'inclure le fichier dans lequel est définie la classe, afin que le moteur puisse la charger…

par x@v » 18 avr. 2008, 01:22

dans la doc il est dit
<?php
function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MaClasse1();
$obj2 = new MaClasse2();
?>
Mais pour moi l'utilisation n'et pas très clair ?
faut-il déclarer cette fonction dans chaque fichier ?

par Hywan » 17 avr. 2008, 19:32

Oui, c'est ce que je pensais et je regardais les sources de PHP pour savoir pourquoi il ne fait pas ça. Mais je n'ai pas pris beaucoup de temps et j'ai pas trouvé. S'il y a un volontaire (ou sinon, je poursuivrai ma recherche plus tard).

par Sékiltoyai » 17 avr. 2008, 19:28

C'eût peut être été plus malin de stocker les inodes, non ? :-/

par Hywan » 17 avr. 2008, 14:45

J'avais entendu de ce genre de cache mais je n'étais pas sûr. Est-ce que quelqu'un connaît un peu mieux ?

par Hubert Roksor » 17 avr. 2008, 14:21

Pourquoi ? Parce qu'en fait, il stocke les noms des fichiers en mémoire.
Si mes souvenirs sont bons, je crois me rappeler que la différence de performance est dûe à la nécessité de normaliser les chemins d'accès par realpath() pour les chemins relatifs. Entre-temps, PHP s'est doté d'un cache pour realpath() donc l'écart à dû se réduire dans certains cas. Il y a peut-être aussi un processus de normalisation pour les chemins absolus pour éviter d'inclure le même fichier via deux chemins différents (liens symboliques). Pour les chemins relatifs, il y a aussi la gestion d'include_path, qui force PHP à chercher le fichier sous plusieurs chemins d'accès, d'ailleurs.

damdec, si tu veux mesurer de ton côté, essaie d'utiliser des chemins absolus plutôt que des chemins relatifs. Dans tous les cas, à l'échelle d'une page normale (<10 includes) je doute que la différence soit mesurable, c'est pour ça qu'__autoload() et spl_autoload() sont préférables.

par damdec » 17 avr. 2008, 13:52

Merci de vos réponses, quand j'aurais le temps je ferais un bench et je viendrais vous dire les résultats , en attendant j'opte pour la fonction maison.

par Hywan » 17 avr. 2008, 00:10

Hey :),

include/require _once ne sont pas désastreux mais c'est vrai que ça vient vite lourd. Pourquoi ? Parce qu'en fait, il stocke les noms des fichiers en mémoire. Donc à chaque include/require _once, il va vérifier si le fichier n'a pas déjà été inclue ou pas. L'étape de vérification ajoute un temps supplémentaire à la charge du fichier en mémoire, c'est tout à fait normal. De là à dire que c'est désastreux ...
Pour d'énormes applications ou frameworks (tels Joomla! ou Zend Framework), oui, ça peut vraiment ralentir le système de ... quelques dixièmes de secondes (mais accumulées à tout le reste ...). Mais oui, fais un bench sur des include/require _once de 1000 fichiers, tu seras fixé ;-).

Néanmoins, tu peux utiliser ta propre fonction ou la méthode d'auto-chargement, comme l'a si bien suggéré Sékil ;-). Comment faire ta propre fonction maison ? Voir le statisme de PHP. Je te fais confiance Jules, t'es pas un débutant, tu sais lire le manuel ;-).

Après, tout dépend de tes besoins. Ici tu nous donnes l'exemple avec class_exists, donc je vais évidemment dans le sens de Sékil : auto-chargement.

par Jules Petibidon » 16 avr. 2008, 23:43

Non, non, il faut dire ce qui est !

Pour le chèque t'as bien tout noté hein ?

par Sékiltoyai » 16 avr. 2008, 22:48

Sinon Sekiltoyai a donné la meilleure méthode je dirais :)
Non, c'est trop, c'est trop :D :mrgreen:

par Jules Petibidon » 16 avr. 2008, 22:13

J'ai cru lire quelque part (me demandez pas ou, je sais plus) que les perfs de [require/include]_once étaient désastreuses comparées à include/require.

Donc quitte à faire un test avec class_exists(), autant utiliser un simple require puisque l'effet sera le même.

Sinon Sekiltoyai a donné la meilleure méthode je dirais :)

par Sékiltoyai » 16 avr. 2008, 18:30

Fais un bench.
Mais personnellement, je verrais plutôt le bénéfice fonctionnel de la fonction __autoload()…