|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() |
Bonjour,
je suis face à un choix et je ne suis pas sûr de la meilleure solution. J'utilise plusieurs classes pour mon script et je ne sauvegarde pas tout dans la base de données, j'utilise un fichier dans lequel j'ai "sérialisé" (linéarisé) une classe. Pour récupérer les données j'utilise la fonction unserialize. Mon problème est que je me demande s'il vaut mieux relire le fichier à chaque fois qu'une page est chargée ou alors est-ce que cela serait plus judicieux de le mettre dans une variable de session ? Sachant que la classe comporte quand même pas mal variables et donc que ce qui doit être mémorisé prend au moins 4 à 5 Ko et peut aller jusqu'à 100-200 Ko voir plus dans le pire des cas. Je me pose aussi une autre question quant à l'utilisation de la fonction session_register(), est-ce adapté à mon problème ? Merci d'avance. Cordialement, Jérémy. |
|
|
00
|
|
|
#2 | |
|
Membre du Club
![]() Inscription : juillet 2006 Messages : 66 ![]() |
Bonjour,
les sessions, nous sommes d'accord, ce sontd es fichiers stockés sur le serveur identifiés par un identifiant ( PHP_SESSID ) donc, il y a bien un acces fichiers entre chaque page et a mon avis, même en fesant ton propre session_handler, tu ne fera pas mieux que le gestionnaire de session standard ( sinon ça serait fait Aprés un acces base de donnée, en plus de la taille de stockage je ne pense pas ( et peut-etre que je me trompe Citation:
ps: 100-200 Ko tu te rend compte EDIT : il y a surement plein d'avis different dans ce post : http://www.developpez.net/forums/d6088/php/php-sgbd/php-mysql/optimisation-scripts-php-mysql/ ( histoire de te rendre plus indécis sur la solution )
|
|
|
|
00
|
|
|
#3 | ||
|
Invité de passage
![]() |
Citation:
J'ai vu qu'on pouvait utiliser cette fonction comme ceci : sessio_register("Nom_de_la_Classe"); (je pense). Qu'est-ce qui est étonnant ? (ça peut aller jusqu'à plusieurs (10 maxi) Mo dans le cas le plus exagéré). Citation:
J'ai parcouru ce topic, il est assez étonnant (du début à la fin), mais la plus grande optimisation reste au niveau des requêtes ce que j'essaye justement d'éviter avec ce système. D'ailleurs, est-ce une bonne idée ? |
||
|
|
00
|
|
|
#4 | ||
|
Membre du Club
![]() Inscription : juillet 2006 Messages : 66 ![]() |
Citation:
donc $_SESSION['unevariable'] ou session_register('unevariable') revient au même. Citation:
( d'ailleur parfois il n'y a pas de cookie et l'identifiant de session est passé par l'url session.use_cookies = 0 ) ou crois tu que les informations sont stockés... ? ( dans un fichier, dont tu peux voir la localisation via http://fr.php.net/manual/fr/ref.sess...sion.save-path ) |
||
|
|
00
|
|
|
#5 | ||||
|
Invité de passage
![]() |
Si j'ai bien compris tu me dit qu'il vaut mieux que j'utilise une session que mon système avec un fichier que j'ouvre via fopen... ?
Mais j'ai quand même besoin du fichier pour charger les données lors du premier chargement de la page... donc cela revient à prendre 2 fois plus de place sur le serveur. Sinon, je ne suis pas sûr de tout avoir compris, est-ce que c'est plus lent de faire : Code :
Code :
Qu'est-ce qui est vraiment mieux ? |
||||
|
|
00
|
|
|
#6 | ||
|
Membre du Club
![]() Inscription : juillet 2006 Messages : 66 ![]() |
Tout d'abord,
Code :
puis tu implode ce tableau en le séparant par un retour chariot. le plus rapide ne serait il pas de seulement récupéré le contenu qui apparement ( selon ton code ) est déja séparé sous forme de ligne. je te conseille donc file_get_contents() ( plutot que "file" suivi de implode ) Sinon, je pense que ton deuxiéme bout de code est plus rapide, mais puisque tu dis ne pas avoir le choix, utilise la premiére solution Aprés pour ce qui est de savoir s'il est plus rapide d'avoir une session qui contient beaucoup de donnée ou un acces base de donnée, je ne sais pas. |
||
|
|
00
|
|
|
#7 |
|
En attente de confirmation mail
![]() Inscription : juin 2002 Messages : 6 164 ![]() |
Pour revenir sur les sessions :
Un argument en faveur des sessions : elles sont, disons, déjà prévues pour. Vous n'avez aucun besoin de sérialiser ou désérialiser vous-mêmes vos données ce mécanisme est transparent car effectué par PHP en interne (bien qu'il y est quelques particularités pour des objets). Arguments en sa défaveur :
Par contre, des objets placés en session ne seront pas forcément lus moins souvent que votre autre méthode (les fichiers). Dès lors qu'il y aura l'appel à session_start vos objets seront désérialisés par PHP pour vous les mettre à votre disposition via le tableau $_SESSION (c'est du tout ou rien : vous ne pouvez pas demander qu'un seul objet par exemple). |
|
|
00
|
|
|
#8 | ||||
|
Invité de passage
![]() |
J'utilise la fonction __sleep() pour la sérialisation de mes données et comme je n'ai besoin que de 3 variables, elles sont les seules à être sérialisées (ce sont 3 tableaux).
Je ne comprend pas bien comment on utilise les sessions dans ce cas de figure, dites moi si je me trompe mais je vois ça comme suit (d'après ce que j'ai compris de vos dires): Code :
D'ailleurs, est-ce que si j'utilise la fonction __wakeup() de la manière suivante cela peut être utilie ? : Code :
|
||||
|
|
00
|
|
|
#9 | |||||||
|
En attente de confirmation mail
![]() Inscription : juin 2002 Messages : 6 164 ![]() |
Citation:
Citation:
Citation:
|
|||||||
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() |
Je pense avoir trouvé une solution mais pour cela il faudrait que je procéde de la manière suivante :
- Un fichier contient certaines variables sérialisées - Et un autre fichier en contient d'autre Comme ça, sur certaines pages je ne doit lire un seul qui fichier qui est de taille relativement petite (au maximum quelques Ko). Mais pour d'autre pages je n'ai pas le choix, il faut tout de même lire le second fichier. Cela pose quand même un autre problème puisque qu'il faudrait utiliser deux fois d'affilé la désérialisation. Comment faire alors ? J'ai pensé à ceci : je lis un des deux fichiers et on est sur une page qui nécessite de lire le second j'utilise ceci : Code :
<?php $classe = unserialize($contenu_fichier1.$contenu_fichier2); ?> Mais au fait, est-ce que la fonction __wakeup est exécutée avant ou après la désérialisation ? |
|
|
00
|
|
|
#11 | ||||
|
Invité de passage
![]() Inscription : février 2007 Messages : 3 ![]() |
__wakeup est appelé pour désérialisé une classe. donc il n'y a pas d'appel avant ou après. ce que je te propose si j'ai bien compris ton pb:
Code :
Code :
|
||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com