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 :

Monitoring temps réel d'une sauvegarde


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 48
    Points : 21
    Points
    21
    Par défaut Monitoring temps réel d'une sauvegarde
    Bien le bonjour !

    Je viens quémander votre aide puisque je ne sais pas trop par ou commencer mon script.

    Petite explication : J'ai un script de sauvegarde que j'ai écrit en php. Il fonctionne très bien (c'est déjà ça). Mais quand on augmente le nombre de switchs à sauvegarder, le temps d'exécution devient long, et finit indéniablement par dépasser le time limit de 30s de PHP. Non, je vous arrête tout de suite, je ne ferait pas de set time limit (0), c'est un peu brouillon et incomplet !

    Je ne comprends pas pouquoi j'ai autant de mal à trouver des sujets de personnes qui se seraient déjà confronté à cette situation qui ne me semble pas rarissime :

    Au lieu de sauvegarder d'un coup tous les switchs (et d'avoir une page blanche statique le temps que le php s'exécute), j'aimerais lancer une sauvegarde, afficher le résultat, puis une autre etc...

    Le fameux flush() de php me parait trop instable.

    Je serais plus volontier parti sur de l'AJAX, mais je ne sais pas trop comment m'y prendre pour au final avoir ma page qui tient l'utilisateur informé de la sorte :

    - Sauvegarde du switch n° XXX [symbole de chargement] puis 'FINI'
    - Sauvegarde du switch n° XXX +1 [symbole de chargement] puis 'FINI'
    - Sauvegarde du switch n° XXX +2 [symbole de chargement] puis 'FINI'
    etc.

    une piste de recherche peut être ?

    Merci du coup de main !

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    t'as APC ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    Bonjour !

    Non je ne l'ai pas, mais s'il s'agit de la seule solution je peux l'intégrer.

    En attendant je vais chercher un peu de documentation !

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par Hugo_O Voir le message
    Bonjour !

    Non je ne l'ai pas, mais s'il s'agit de la seule solution je peux l'intégrer.

    En attendant je vais chercher un peu de documentation !
    non, sinon fait ça en session

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    Est-ce que passer par les sessions c'est plus propre que de recharger la page avec un indice que j'incrémente dans l'url ?

    Je veux dire par la que mon script feriat les actions suivantes :

    - récupération de la première IP enregistrée dans la BDD
    - ping de cette adresse
    - en cas de réponse, lancement du script de sauvegarde
    - rafraichissement de la page (avec un echo pour témoigner du succès) et on incrémente une variable dans l'url pour sauvegarder le second switch etc.

    Je doute que ce soit possible quand je lis les précautions à prendre avec les header location machin :/

  6. #6
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    Ta solution est une technologie client.
    Ce que te proposes stealth35 est une solution serveur.

    A toi de choisir, mais pour ma part j'aurai une préférence sur la solution serveur. Pourquoi ? Parce qu'on a la main sur le serveur et qu'à un instant t il est unique, chose qu'on ne maitrise pas avec les différents clients.

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    Soit mais je ne sais pas trop ou veut en venir stealth ?

    comment en php je vais pouvoir actualiser la page avant la fin du script ?

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    double post furtif

    N'est-il pas possible, lorsque l'on clique sur un bouton style "tout sauvegarder", de faire une petite requête SQL pour connaitre les IP à "pinger", puis de faire une multitude de scripts AJAX qui se donnent la main à chaque fois que le précédent à terminé ?

    Le problème reste le même, je ne comprends pas comment faire passer ma variable PHP (IP du switch) à la partie javascript, puis passer à l'adresse IP suivante etc...

    Jusqu'à maintenant (j'ai débuté PHP il y a peu), j'utilisais la structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ($machin = mysql_fetch_array($truc))
    {
       //du php...
    }
    Ainsi je récupérais toutes les IP, sauf qu'avec près de 100 switchs à "pinger" + sauvegarder, c'est plus une structure valable

  9. #9
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    Tu lances ton traitement PHP de façon asynchrone.
    Dans ton script tu mets à jour une variable de session au fur et à mesure que ton script avance.
    Puis il suffit de faire un autre script PHP qui renvoie l'état de la variable de session et de l'appeler pour connaitre l'avancement.

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    Sauf erreur de ma part ça ne résoud pas le problème du time_limit, si ?

    Ou alors je n'ai pas saisi !

  11. #11
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    Non mais tu peux garder un marqueur de position et donc découper le travail pour éviter le time_limit.

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    mince ça ne me dit rien du tout :/

    Aurais-tu un exemple ou un tutoriel s'il te plait ?

    Merci du coup de main !

  13. #13
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    Cela te parle les systèmes de pagination ? Bah c'est la même chose mais pas appliqué à un traitement d'affichage.

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    hmmmm

    je vais essayer de voir ça alors

  15. #15
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    J'aime le double postLe double post, c'est mal

    Ou alors, je ne sais pas si ce que je vais dire est compréhensible mais je vais faire de mon mieux !

    Si je modifiais ma fonction de ping/sauvegarde (appelée en AJAX), afin qu'elle ne sélectionne que les 10 premiers switchs, les sauvegarde... Serait-il possible de lui faire sélectionner les 10 suivants ?

    Je sais pas s'il existe un outil SQL pour ça !

    En gros en SQL j'utilise un LIMIT, mais il me faudrait une sorte de flag pour que la fonction de sauvegarde, appelée une seconde fois en ajax, sauvegarde les dix switchs suivants et pas les 10 premiers !

    Est-ce que je plane complètement où y a t'il un potentiel dans cette méthode ?

  16. #16
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    a quoi il ressemble ton script

  17. #17
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    voilà pour le script partie PHP :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    function sauvegarder($id)
    {
     
    		//initialisation des débuts et fins de scripts
    		$debseq = '#! usr/bin/perl -w
    use strict;
    use warnings;
    use Net::Telnet;';
     
     
    //variable contenant l'adresse du server TFTP
    	$iptftp = '192.168.2.9';
     
     
    //préparation de la requête sql
    	$sql = 'SELECT `IP_Switch`,`seq_save`,`Prompt`, `Pass_switch` FROM `switch` WHERE `Id_Switch` = "'.$id.'"';
     
    //traitement...
    	$req = mysql_query($sql) or die ('ERREUR SQL !' .$sql. ' <br/> '.mysql_error());
    	//enregistrement dans un tableau
    	$data = mysql_fetch_array($req);
     
    	//Génération du nom du fichier de configuration : (data[0] contient l'IP du switch concerné)
    	$nomcfg = "config$data[0].doc";
     
     
    //à ce stade, nous connaissons l'id du switch, son prompt, le numéro de seq_save. Il nous faut faire correspondre le numéro de seq_save avec l'id de la séquence, et nous enregistrerons cette partie de la séquence dans une variable. Cette variable sera celle dans laquelle str_replace va chercher les occurences à remplacer
     
    //requête pour obtenir le bon morceau de séquence
    $sql2 = 'SELECT `sequence` FROM `script`,`switch` WHERE `Id_sequence` = `seq_save` AND `Id_Switch` = "'.$id.'"';
     
    //traitement de la requête :
    $req2 = mysql_query($sql2) or die ('ERREUR SQL !' .$sql. ' <br/> '.mysql_error());
    //ici seqvar contient des données (notre morceau de séquence en réalité). 
    $seqvar = mysql_fetch_array($req2);
     
     
    //Nous avons à présent tous les éléments en main pour modifier $seqvar (morceau de la séquence qui varie selon le modele de switch) et l'adapter à notre situation
     
    //Nous allons créer un tableau contenant les éléments à remplacer (|IP|, |PROMPT|...) Ainsi qu'un tableau contenant les éléments qui les remplaceront (192.168.X.X ...)
    //Remarque : L'ordre est capital pour ces tableaux car la fonction str_replace va remplacer le premier élément par le premier, etc...
     
    $aremplacer =  array("|IP|","|MDP|","|PROMPT|","|PROMPT|","|TFTPSRV|","|NOMCONF|","|PROMPT|"); 
    $remplacant	= array("$data[0]","$data[3]","$data[2]","$data[2]","$iptftp","$nomcfg","$data[2]");
     
    //Nous avons tout ce qu'il faut pour utiliser str_replace et on enregistrera le résultat dans une variable
     
    $resteseq = str_replace($aremplacer,$remplacant,$seqvar);
     
    //Nous avons un début  de séquence fixe et affecté, notre séquence variable a été modifiée en fonction du modèle sélectionné, il ne nous reste qu'à concaténer le tout pour avoir le script de sauvegarde complet :
     
    $seqfinal = $debseq.$resteseq[0];
     
    //ouverture (création s'il n'existe pas) du script perl qui va créer la liaison telnet et le transfert. Note : En écriture car le programme va modifier son contenu (fwrite ci-dessous) selon le switch à sauvegarder
    $fpperl = fopen("scripts/poney.pl", "w+");								
     
    // on écrit dans $fp la séquence
    fwrite($fpperl, $seqfinal);
    fclose($fpperl);
     
    //exécution du script, génération du fichier de config si cela a fonctionné
    exec('scripts\\poney.pl');
     
    //destruction du script perl
    unlink('scripts/poney.pl');
     
    if(file_exists('scripts/'.$nomcfg.''))
    {
    	//si le transfert à fonctionné, on va enregistrer un certain nombre d'infos sur le fichier de configuration dans la base de données afin de pouvoir administrer ces derniers :
     
    	$contenu = file_get_contents("scripts/$nomcfg");
     
     
     
    $sqlfile = 'INSERT INTO fichierconf VALUES("'.$nomcfg.'",NOW(),"'.mysql_real_escape_string($contenu).'")';
     
    mysql_query($sqlfile) or die ('Erreur SQL !' .$sqlfile.' <br/>' .mysql_error());
    unlink('scripts/'.$nomcfg.'');
     
    	}
    		}
     
     
    		//Ma fonction de ping
     
    		function ping($host,$port,$timeout)
    		{
    			$fpping = fsockopen($host, $port, $errno, $errstr, $timeout);
    			if(!$fpping)
    				{
    					return "DOWN";
    				}
    			return "OK";
    		}
     
     
     
    		//Ma fonction de sauvegarde générale se servant de la fonction ping ci dessus
    			function ping_and_save_switch()
    {
    	//requête sql pour obtenir toutes les IP (i.e : tous les switchs a sauvegarder)
    	$sqlselectip = 'SELECT IP_Switch FROM switch';
     
    	//traitement de la requête
    	$reqselectip = mysql_query($sqlselectip) or die ('Erreur sql ! '.$sqlselectip. '<br/> ' .mysql_error());
     
    	//On boucle pour avoir chaque IP
    	while($host = mysql_fetch_array($reqselectip))
    		{
    			//Pour réaliser un ping, on est sur le protocole ICMP ou la notion de port n'intervient pas. Pour autant, fsockopen() doit se voir spécifier un port. Ici j'ai choisi le 80 mais c'est un risque. En effet, ce port est utilisé pour le web et rien ne me garantit que tous les switchs ne le supportent ! A méditer...
    	$port = 80;
     
    	//Un délai en secondes, suffisant pour les switchs...et les impatients
    	$timeout = 3;
     
    	//la variable $test va contenir le résultat de la fonction ping(), a savoir OK ou DOWN,    host[0] va successivement prendre les valeurs des IP des switchs
    	$test = ping($host[0], $port, $timeout);
     
    	if($test == "OK")
    		{
    			//il va falloir récupérer les id des switchs qui répondent pour les passer en paramètres a ma fonction de sauvegarde
     
    			//la requête SQL
    			$sqlselectid = 'SELECT Id_Switch FROM switch WHERE IP_Switch = "'.$host[0].'"';
     
    	//Traitement de la requête
    	$reqselectid = mysql_query($sqlselectid) or die ('Erreur SQL !' .$sql. '<br/> '.mysql_error());
     
    	//On stocke les ID des switchs qui ont répondu dans un tableau que nous allons parcourir pour lancer la fonction de sauvegarde uniquement sur ceux-ci
    	$dataselectid = mysql_fetch_array($reqselectid);
     
    	//lancement de la fonction
    	for($i=0;$i<5;$i++)
    	sauvegarder($dataselectid[0]);
    }
     
     
    		/*	elseif($test == "DOWN")
    				{
    					echo 'Ping &eacute;chou&eacute;<br/>';
     
    					ON PEUT IMAGINER d'envoyer un mail ou un avertissement pour signaler chaque switch qui n'a pas répondu et qui, par conséquent, n'a pas été sauvegardé !
     
    				}*/
     
    			/*else
    				{
    					echo 'une erreur est survenue !!';
    				}*/
    		}
    }
    EDIT : Ne pas préter attention à la boucle for, elle était la pour simuler un plus grand nombre de switch

  18. #18
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Que fait ton script Perl ?

  19. #19
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 48
    Points : 21
    Points
    21
    Par défaut
    Il utilise un module permettant une conection Telnet avec un switch

    En fonction de la marque et du modèle, il envoie les commandes telnet pour accèder au fichier de configuration, et attend la réponse du switch le "prompt".

    Dans un soucis de compatibilité avec les différentes marques, j'ai enregistré les différents prompts des switchs dans ma base de donnée, ainsi que les mots de passe etc. et ainsi, php les remplace dans le script Perl qui est donc compatible avec tous les switchs !

  20. #20
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    pourquoi tu fais pas du SNMP ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/10/2006, 11h15
  2. insertion en temps réel dans une combolist
    Par new_wave dans le forum VB 6 et antérieur
    Réponses: 17
    Dernier message: 05/09/2006, 17h55
  3. Réponses: 4
    Dernier message: 16/06/2006, 03h29
  4. [VB.NET] Gestion en temps réel d'une bdd access
    Par qwiskas dans le forum Windows Forms
    Réponses: 6
    Dernier message: 12/02/2005, 19h37

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