Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/03/2011, 15h48   #1
Membre régulier
 
Inscription : novembre 2010
Messages : 102
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 102
Points : 86
Points : 86
Par défaut File d'attente fichier DNS

Bonjour,

Dans le cadre de mon stage, je dois faire un DNS dynamique. Les utilisateurs rentrent leurs ip via une page web ou un logiciel sur leur machine.

La page web reçoit des paramètres en entrée tel que le nom d'utilisateur et la zone DNS à changé.

Tant qu'il y a un délai entre 2 entrées sur le dns, il n'y a aucun problème. Cependant, si 2 utilisateurs utilisent le script en même temps, il y a un risque de plantage. En l’occurrence, j'ouvre 4 onglets en même temps via un script donc 4 nouvelles entrées sur le DNS. Il y a en général au moins deux entrées qui passent.

Je voudrais donc faire un système de file d'attente afin de récupérer tous les utilisateurs. Car si on attend la fin du script, l'ajout marche complètement.

On va dire qu'on envoie les utilisateurs test1, test2, test3 et test4 en même temps.

J’aimerais que php fasse ça:
Citation:
changement sur test1 sleep(1);
changement sur test2 sleep(1);
changement sur test3 sleep(1);
changement sur test4 sleep(1);
Donc maintenant, la grande question: comment faire?

Pour me facilitée la tâche, il n'y a pas de base de donnée, les utilisateurs ne sont pas sur un navigateur récent (ie6 pour la plupart).

Voici le fonctionnement actuel:

test 1: 1,2
Code :
1
2
3
4
test1                   A	192.168.1.110
test2                   A	1.1.1.1
test3                   A	1.1.1.1
test4                   A	1.1.1.1
test 2: 1,2
Code :
1
2
3
4
test1                   A	1.1.1.1
test2                   A	192.168.1.110
test3                   A	1.1.1.1
test4                   A	1.1.1.1
test 3: 4 Celui qui finis dans le fichier
Code :
1
2
3
4
test1                   A	1.1.1.1
test2                   A	1.1.1.1
test3                   A	192.168.1.110
test4                   A	192.168.1.110
test 4: 3
Code :
1
2
3
4
test1                   A	1.1.1.1
test2                   A	1.1.1.1
test3                   A	1.1.1.1
test4                   A	192.168.1.110
Le retour présenter est ce qui est en sortie du fichier, il n'y a qu'une petite partie du fichier mais ça suffit pour voir le fonctionnement.

Merci d'avance.
Soull est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 08h26   #2
Membre régulier
 
Inscription : novembre 2010
Messages : 102
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 102
Points : 86
Points : 86
J'ai essayé cette solution:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$script_non_fini = true;
while($script_non_fini)
{
    Si l utilisateur est déjà présent:
    {
        Si son ip n a pas changer
        {
            Ne rien faire
            $script_non_fini = false;
        }
        Sinon (ip changer)
        {
            On met a jour son ip
            Si le fichier est conforme a ce qui devais faire
            (si a la fin du script ce qui a dans le fichier est la même chose qu on avait prévu)
            {
                $script_non_fini = false;
            }
        }
    }
    Sinon (utilisateur a créer)
    {
        On crée l utilisateur dans le fichier
        Si le fichier est conforme a ce qui devais faire
        (si a la fin du script ce qui a dans le fichier est la même chose qu on        avait prévu)
        {
            $script_non_fini = false;
        }
    }
}
Donc la, on écrit bien ce qu'on souhaite écrire mais le fichier peut être lu juste avant que quelqu'un fasse une modification dessus. Donc il supprimera les modifications.

J'en reviens donc à la file d'attente.

J'ouvre le fichier comme ceci:

Code :
1
2
3
4
if($handle = @fopen($fichier_dns, 'r'))
{
    if (flock($handle, LOCK_SH)) 
    {
Ensuite il y a le code pour chercher les infos sur le fichier et le préparer la réécriture.

Ce bout de code écrit dans le fichier, c'est le code réel: je ferme la protection juste avant de pouvoir écrire.

Code :
1
2
3
4
5
6
flock($handle, LOCK_UN);
fclose($handle);
$fin_ouverture_fichier = microtime_float();
// pour calculer le temps d'ouverture de fichier
																
$etat_ecriture = file_put_contents($fichier_dns, $f, LOCK_EX);
Ensuite le controle:
Code :
1
2
3
4
$f_ack = file_get_contents($fichier_dns);
if(strcmp( $f, $f_ack )==0);
{
	$script_non_fini = false;
Si vous voyez la faille dans le raisonnement, n'hésitez pas.

Cordialement.
Soull est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 14h49   #3
Membre régulier
 
Inscription : novembre 2010
Messages : 102
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 102
Points : 86
Points : 86
Je viens vous donner des nouvelles, alors pour les changements:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
// Boucle tant que le script n'est pas fini
if (!file_exists("occuper.txt")) 
{	
	$temps_creation = microtime_float();
	if(file_put_contents("occuper.txt", " ", LOCK_EX)==1)
	{
             // Script d'avant
        }
 
        if(!$script_non_fini)
	{
		if(!unlink("occuper.txt"))
		{
			$script_non_fini = true;
		}
	}
	else
	{
		$attente = random(0,2);
		sleep($attente);
	}
Donc maintenant, je regarde si le fichier "occuper.txt" est présent, s'il l'est, je reboucle. S'il ne l'est pas je le crée.

Une fois qu'il est créer, les autres sont en file d'attente: une boucle infini.

Une fois que le script à finis son travail, il supprime le fichier et les autres peuvent travailler à leurs tours.

Alors c'est bien beau, ça gère 3 ajouts au minimum en même temps. Mais ça ne me suffit pas: je ne voie pas la faille dans ma logique donc je n'ai pas envie d'arrêter ici. Sa fonctionerrais pour l'entreprise, mais j'ai l'impression que ce n'est pas finis.

Je suis donc partie sur une autre solution en plus, la ram est entre 100 & 1 000 fois plus rapide que les dds, je veux donc mettre mon fichier occuper.txt dans la ram.

J'ai donc découvert les variables d’environnement.

Voici ce que j'ai pondu:
Code :
1
2
3
4
5
6
$test = `set /A OCCUPER=4`;
	print_r($test);
	echo "<hr />";
	$test2 = `set OCCUPER`;
        // $test2 = `echo %OCCUPER%`; ne fonctionne pas non plus
	print_r($test2);
=>
4
<hr />
*rien*

Donc mon nouveau problème est de savoir comment garder une variable d’environnement en mémoire: php ouvre une autre fenêtre cmd, donc les variables sont supprimées...

Si vous avez une solution pour faire une fille d'attente, stocker des variables en ram, ou devenir riche, n'hésitez pas ^^
Soull est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h34.


 
 
 
 
Partenaires

Hébergement Web