IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

File d'attente fichier DNS


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2010
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2010
    Messages : 111
    Points : 152
    Points
    152
    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:
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2010
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2010
    Messages : 111
    Points : 152
    Points
    152
    Par défaut
    J'ai essayé cette solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2010
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2010
    Messages : 111
    Points : 152
    Points
    152
    Par défaut
    Je viens vous donner des nouvelles, alors pour les changements:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ^^

Discussions similaires

  1. [Tableaux] créer une file d'attente en php
    Par gaetan.tranvouez dans le forum Langage
    Réponses: 12
    Dernier message: 01/06/2006, 18h49
  2. [File]Comparer 2 fichiers
    Par onlytoine dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 05/12/2005, 17h24
  3. Mes emails restent en file d'attente sur mon serveur
    Par FredericB dans le forum Réseau
    Réponses: 3
    Dernier message: 26/10/2005, 10h04
  4. Gestion d'une file d'attente
    Par jesus144 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 22/09/2005, 19h58
  5. recupèrer file d'attente d'impression
    Par magic corp. dans le forum Langage
    Réponses: 2
    Dernier message: 25/09/2002, 14h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo