2010-08-16 7 views
0

J'essaie de faire une fonction de journalisation avec php pour un outil qui capture les informations de l'ordinateur sous Windows. Toutes les 15 secondes, le fichier a txt sera produit avec des informations à l'intérieur. Je veux le faire fonctionner en arrière-plan pendant que l'utilisateur accède à d'autres pages et ne pas être interrompu.En boucle une partie du code PHP toutes les 15 secondes

Voici le code que je suis maintenant en utilisant

<?php 
     $tracker = $_GET['counter']; 
     if (isset($tracker) && $tracker == 1) 
     { 
      $_SESSION['tracker'] = 1; 

      $query = "SELECT hostname FROM computers ORDER BY hostname ASC"; 
      $computer_search = mysql_query($query); 
      confirm_query($computer_search); 

      while ($computers = mysql_fetch_array($computer_search)){ 
       $COMP = $computers['hostname']; 
     $time = time(); 
     shell_exec('perl logger.pl ' . $COMP . ' >> logs/' . $COMP . '-' . $time . '.txt'); 
      } 

      redirect_to('index.php?tracker=1'); 
     } 
     elseif (isset($tracker) && $tracker == 0) 
     { 
      $_SESSION['tracker'] = 0; 

      redirect_to('index.php?tracker=0'); 
     } 
    ?> 

Au début, j'ai essayé d'utiliser

$query = "SELECT hostname FROM computers ORDER BY hostname ASC"; 
      $computer_search = mysql_query($query); 
      confirm_query($computer_search); 

      while ($computers = mysql_fetch_array($computer_search)){ 
       $COMP = $computers['hostname']; 
       $time = time(); 
       // 1 is the counter entered into the perl script 
       shell_exec('nohup perl logger.pl ' . $COMP . ' 1 > /dev/null 2> /dev/null >> logs/' . $COMP . '-' . $time . '.txt'); 
      } 

Mais le code ne capture que des informations d'un ordinateur et se coince dans la boucle avant de capturer la informations de l'ordinateur suivant. D'un autre côté, le premier code ne capture que les données de tous les ordinateurs, mais seulement une fois. En ce qui concerne le logger.pl, voici ce que j'ai fait.

!/usr/bin/perl -w 
    use BER; 
    use SNMP_util; 
    use SNMP_Session; 

    $MIB1 = ".1.3.6.1.2.1.25.3.3.1.2"; #Cpu Processors 
    $MIB2 = ".1.3.6.1.2.1.1.3"; #System Uptime 
    $MIBIPAdd = ".1.3.6.1.2.1.4.20.1.1"; 

    $HOST = shift; 
    # taken out for 1st code 
    #$tracker = shift; 

    #while ($tracker == 1) 
    { 
    print "Computer Name: $HOST\n"; 
    $count = 0; 
    # ($MIB1) && ($HOST) || die "Usage: $0 MIB_OID HOSTNAME"; 
    (@values) = &snmpwalk("$HOST","$MIB1"); 
    foreach $value (@values) 
     { 
     $count++; 
    if ($value) { 
     $goodvalue = &strip_comment($value); 
     print "CPU Usage of Processor $count: $goodvalue%\n"; } 
     if ($value > 90){ 
      print "Warning: CPU Usage over 90%! \n" 
     } 
    else { warn "No response from host :$HOST:\n"; } 
} 

(@valuesIP) = &snmpwalk("$HOST","$MIBIPAdd"); 
$ipaddress = &strip_comment($valuesIP[1]); 
print "IP Address: $ipaddress \n"; 

($value) = &snmpwalk("public\@$HOST","$MIB2"); 
if ($value) { 
    $goodvalue = &strip_comment($value); 
    print "System Up Time: $goodvalue\n"; } 
else { print "No response from host: $HOST\n"; } 

print "\n"; 
sleep(15); 
    } 

    sub strip_comment 
    { 
$theline = shift; 

$where = index($theline, ":"); 

if($where eq -1){ 
    return $theline; 
} 

$selectedpart = substr($theline, $where); 
$goodpart = substr($selectedpart, 1); 


return $goodpart; 
} 
+1

utilisez-vous un cron? – dmp

+0

Votre ligne perl shebang est erronée. – Ether

+0

Salut Ether, alors que dois-je utiliser? J'ai essayé sans le -w mais ne fonctionne pas. – vrerer

Répondre

2

vous devez utiliser une tâche cron, créer un script avec le morceau de code que vous voulez exécuter toutes les 15 secondes, puis ajouter une tâche cron qui planifiera le script à exécuter toutes les 15 secondes

+0

Désolé, j'ai oublié de mentionner que je le fais sous Windows. – vrerer

+0

Utilisez ensuite les tâches planifiées de Windows. –

+1

@vrerer windows dispose également d'outils de planification. vérifier le manuel de Windows pour la commande 'AT' –

0

Utilisez sleep(15); dans votre boucle. Il utilisera peu de ressources jusqu'à l'expiration du délai.

+0

J'ai essayé cela et cela fait que le site boucle, puis expire, l'utilisateur n'est également pas capable de faire quoi que ce soit sur le site. – vrerer

+0

vous devez 'set_time_limit (0)' si vous prévoyez d'exécuter le programme indéfiniment! – stillstanding

+1

Si vous êtes sur un système basé sur des sessions, vous devrez 'session_write_close()' avant d'entrer dans la boucle. Le gestionnaire de session basé sur un fichier par défaut verrouille le fichier de session alors qu'un script l'utilise activement, empêchant toute autre requête de se poursuivre jusqu'à ce que le verrou soit libéré (le script se termine et/ou la session est fermée). –

Questions connexes