8797 sujets

Développement web côté serveur, CMS

Bonjour.

J'ai des variables de configuration qui sont sauvegardées dans un fichier texte et qui sont communes à tous les administrateurs donc leur place n'est normalement pas dans la session. Ce dont j'aurais besoin serait plutôt un tableau superglobal qui soit commun à tous les scripts et tous les utilisateurs et qui ne serait donc qu'une seule fois stocké dans la mémoire. Cependant après avoir chercher dans le manuel je n'ai pas trouvé de solution. Ai-je mal regardé ou n'y a-t-il réellement aucune solution ?

Merci d'avance.
Modifié par Changaco (16 Dec 2007 - 15:50)
Salut,

J'ai peut-être mal compris, mais si ce sont des paramètres de configuration communs, il ne suffirait pas de déclarer les variables (ou les constantes ...) dans un fichier, que tu inclus ensuite dans tous les scripts concernés ?
Thomas D. a écrit :
Salut,

J'ai peut-être mal compris, mais si ce sont des paramètres de configuration communs, il ne suffirait pas de déclarer les variables (ou les constantes ...) dans un fichier, que tu inclus ensuite dans tous les scripts concernés ?
Si mais est-ce que PHP n'utilise bien qu'un seul emplacement mémoire pour ces variables juste parce qu'elles sont dans un fichier à part ?

Édit : je suppose que oui, ma question était un peu conne quand on y réfléchit ...
Modifié par Changaco (16 Dec 2007 - 16:23)
En fait non ma question n'était pas si bête que ça car si je mets les variables dans un fichier PHP que j'appelle pour chaque page alors je suppose que PHP examine la page à chaque fois à moins qu'il ne soit optimisé pour ne pas examiner la même page deux fois si elle n'a pas changée et n'attends pas de variables extérieures ce dont je doute. Donc ma page serait lue à chaque fois et par conséquent je perd du temps par rapport à une variable superglobale.

Enfin bon si on ne peut pas définir de variable superglobale commune à tous les utilisateurs alors je pense que je vais stocker mes données dans la session car il s'agit de la configuration de la partie administration donc elle sera présente dans peu de sessions.
Modifié par Changaco (16 Dec 2007 - 16:36)
Je ne suis pas persuadé que la lecture des variables de configuration, même avec l'utilisation de la fonction include(), ait un impact palpable sur le temps d'exécution de l'ensemble du script PHP ...
Thomas D. a écrit :
Je ne suis pas persuadé que la lecture des variables de configuration, même avec l'utilisation de la fonction include(), ait un impact palpable sur le temps d'exécution de l'ensemble du script PHP ...
Oui c'est mon avis aussi, ma question est purement théorique. Smiley biggol
Aucune information n'est conservée par php d'une requête http à l'autre. Cela peut être vu comme une force ou une faiblesse. Mais ce n'est pas le sujet ici.

Dans la plupart des cas, quand un utilisateur accède à une page php sur un server, le moteur de php va devoir charger le fichier sur le disque, lire le code, le transformer en opcode, refaire cela autant de fois qu'il y a d'include() ou require() et interpréter l'opcode pour produire le résultat esconté. Chaque accès au disque est potentiellement coûteux en temps, surtout si le moteur doit parcourir l'include_path pour trouver le(s) fichier(s) (plutôt que de préciser des paths absolus). Il vaut donc mieux, dans la mesure du possible, limiter les inclusions de fichiers.

Il existe des extensions pour php (genre EAccelerator ou ZendOptimizer) qui permettent de mettre en cache (en mémoire ou sur le disque) l'opcode des fichiers. Cela permet donc d'éviter l'étape de la transformation du code source en opcode. Peu d'hébergeurs proposent ce genre d'extensions..

a écrit :
Ce dont j'aurais besoin serait plutôt un tableau superglobal qui soit commun à tous les scripts et tous les utilisateurs et qui ne serait donc qu'une seule fois stocké dans la mémoire

Le tableau sera reconstruit à chaque requête et donc sa persistance en mémoire ne durera que le temps d'exécution du script. Il est très fréquent qu'un tel tableau de variables de configuration soit déclaré dans un fichier php à part et chargé (avec un require) au tout début du script. D'éventuelles modifications des variables de configuration lors de l'exécution du script ne persisteront pas pour une requête suivante. Si on veut qu'il y ait persistance, il faut passer par une base de données ou écrire et sauvegarder des fichiers de configuration (.ini, .xml etc) qui seront rechargés à chaque requête. Il peut être judicieux de passer par des sessions mais elles sont par définition propres à un utilisateur et elles ne sont donc pas "globales".
quode a écrit :
Aucune information n'est conservée par php d'une requête http à l'autre.
Même $_ENV ?
Extrait de php.net

a écrit :

Description
bool putenv ( string $setting )

Fixe la valeur d'une variable d'environnement. Cette valeur n'existera que durant la vie du script courant, et l'environnement initial sera restauré lorsque le script sera terminé.

Modifier la valeur de certaines variables système peut être un trou de sécurité considérable. La directive de configuration safe_mode_allowed_env_vars contient une liste de préfixes, séparés par des virgules. Lorsque le Safe Mode est actif, l'utilisateur ne peut que modifier les variables dont le nom commence par les préfixes fournis par cette directive. Par défaut, les utilisateurs ne peuvent modifier que les variables qui commencent par PHP_ (i.e. PHP_FOO=BAR). Note : Si cette directive est vide, PHP autorisera la modification de TOUTES les variables d'environnement !

La directive de configuration safe_mode_protected_env_vars contient une liste de variables d'environnement, séparées par des virgules. Les utilisateurs ne pourront pas modifier ces variables avec la fonction putenv(). Ces variables seront protégées même si safe_mode_allowed_env_vars permet leur modification.


Je pense que la réponse est non Smiley eek

Comme l'a dit quode il n'y a pas de persistence des processus PHP (contrairement au Java) mais je pense que la solution la plus simple est d'utiliser un "include" (ou "require") mais il y a aussi la base de données, les fichiers plats... bref il y a le choix mais dans tous les cas il y aura un algorithme d'analyse, ou de requetage qui sera plus long en traitement qu'un simple include. Attention à ne pas trop utiliser non plus les constantes définies avec define() qui ne trouvent pas un réel interet en php et qui allongent le temps de traitement.

Parfois la solution la plus évidente est la plus simple...

Peut-etre ai-je revé mais il me semble avoir entendu parlé de persistence avec la nouvelle version de php (6) qui arrive... à voir
Modifié par skywalk3r (18 Dec 2007 - 11:39)