include dans une boucle ou autre façon de (re)lire une variable dans un fichier

Eléphanteau du PHP | 23 Messages

04 mars 2009, 10:48

Bonjour,

J'ai une boucle que je voudrait continue tant que l'une des valeurs de mon tableau $config du fichier config.php n'est pas modifiée :
while ($valeur == $config['valeur'])
Comment lire cette valeur dans ma boucle ?

Je craint qu'une sollution avec
include "config.php";
ne revienne à inclure un nombre très important de fois le même fichier, et finisse par saturer la mémoire du serveur:
while ($valeur == $config['valeur'])
{
     //fais des trucs
    include "config.php";
}
- Est-ce que je peux faire ça ? Est-ce que la boucle "efface" l'inclusion à chaque tour ?
- Sinon, quelle(s) autre(s) sollution(s) ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

04 mars 2009, 23:02

Modération :
new morning, le multipostage est interdit sur le forum.

Merci de prendre le temps de lire les règlements.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 5924 Messages

04 mars 2009, 23:04

Un nombre très important de fois, il faudrait que tu étoffes ton idée. L'inclusion n'est pas gratuite en ressources (mémoire, processeur), à terme, tu risques en effet quelques problèmes. Mais il faut préciser l'ordre de grandeur du nombre d'inclusions.

Toujours est-il que pour moi cela relève surtout du problème de conception, à moins d'une raison solide, je ne vois pas à priori l'utilité de procéder ainsi…

Eléphanteau du PHP | 23 Messages

04 mars 2009, 23:08

Un nombre très important de fois, il faudrait que tu étoffes ton idée. L'inclusion n'est pas gratuite en ressources (mémoire, processeur), à terme, tu risques en effet quelques problèmes. Mais il faut préciser l'ordre de grandeur du nombre d'inclusions.

Toujours est-il que pour moi cela relève surtout du problème de conception, à moins d'une raison solide, je ne vois pas à priori l'utilité de procéder ainsi…
En fait la conception est assez rudimentaire : un fichier de config est utilisé pour différents scripts de backup qui tournent tant que l'on ne les stoppe pas. Pour les stopper, il faut modifier la donnée du fichier de config qui les "commande". Accessoirement, cela permet de modifier certains paramètres du backup sans l'interrompre.

Pour ce qui est de stopper le script, j'ai un moyen de contourner en créant un fichier de config par script, dont je peut me contenter de vérifier la date de dernière modif., mais c'est un peu moins "propre" à mon sens que d'aller chercher une valeur dans une base de donnée... ou un fichier de config !

Bref, pas moyen de "recharger" une variable indéfiniment ? Je veux dire par là de façon illimitée mais au plus toutes les heures... J'imagine que ça doit pouvoir se faire avec une base de donnée, non ?

@ zeus : désolé, je sais bien, mais j'ai quand même fait l'effort de poster différemment en signalant le problème rencontré sur un sujet mal amené qui, de ce fait, n'aurait vraisemblablement pas eu de réponse... donc merci d'avoir déplacé.

EDIT : un petit test en local me laisse penser que ça sera pas si problématique :
ob_implicit_flush(true);

set_time_limit(0);	
include 'config.php';
$i=1;

while ($config ['split_size'] == 5)
	{
	echo "Ceci est la ".$i."ème inclusion de config.php <br />";
	$i++;
	include 'config.php';
	}
Résultat : pour l'instant pas de problème, j'en suis à plus de 70 000 inclusions sans soucis, donc on va dire que ça ira question ressources...

ViPHP
ViPHP | 5924 Messages

05 mars 2009, 02:00

Tu peux faire plus simple. Tu peux vérifier l'existence d'un fichier sur le l'arborescence. C'est beaucoup plus léger…

Il y a même d'autres solutions, mais pour cela une question : Tu l'exécutes comment le script, par apache ou bien en ligne de commande ?

Eléphanteau du PHP | 23 Messages

05 mars 2009, 09:25

Le script est lancé depuis le navigateur, donc apache. Mais pour la lisibilité du code, j'aime bien rassembler le tout dans config.php. D'après mon test ça n'a pas l'air de poser de problème, mais ton avis m'intéresse car il ne faudrait pas que ça ralentisse le serveur. En tout cas je compte limiter le nombre d'inclusions en vérifiant avant
include('config.php')
que config.php a été modifié en utilisant
filemtime('config.php')
donc ça devrait tourner au moins un moment, sauf à ce que je m'ammuse à condifier config.php toutes les 5 minutes.

Petit nouveau ! | 6 Messages

05 mars 2009, 11:33

Bonjour,

il y a d'autre solution plus performante pour récupérer une valeur "de configuration"

je n'ai pas testé toutes les solution, mais rien que la fonction parse_ini_file est en moyenne 6 fois plus rapide que le "include" (sur 10 000 itérations).

sinon je pense aussi que la détection de la présence d'un fichier est encore plus rapide.

Eléphanteau du PHP | 23 Messages

05 mars 2009, 11:46

Super intéressant ce parse_ini_file :D

Par contre ça me pose un autre problème : comment je fais l'opération inverse : à partir de mon tableau associatif, issu de $_POST et de $config (par array_merge() ) j'utilisais var_export pour réécrire mon fichier de config :
// Sauvegarder la config
$configTxt = '<'.'?php $config = ' . var_export($config, true) . '; ?'.'>'; // Nouveau contenu 
Il y a une autre façon de faire pour réécrire mon fichier config.ini au "bon" format, c'est à dire avec "clef = valeur" ? Peut-être avec extract ? Je vois pas trop comment faire "l'inverse" de parse_ini_file en fait...