Script qui tourne en boucle online et nickel en local... ???

Script qui tourne en boucle online et nickel en local... ??? - PHP - Programmation

Marsh Posté le 16-10-2005 à 20:47:29    

Yop yop
 
Je comprends plus rien... j'ai un script PHP qui tourne nickel en local avec easyPHP, mais online, il tourne en boucle!!!  :pt1cable:  :pt1cable:  
 
En local (easyPHP): PHP4.x
Online: PHP5
 
Voilà le script:

Code :
  1. if(isset($_GET['makeOnlineStats']))
  2.  {
  3.   // on fais une requete dans la table horaireScan pour le jour actuel et l'heure actuelle
  4.   // si dans la table horaireScan on retrouve une entrée pour l'heure actuelle, alors le script doit etre exécuté!
  5.   // pour les jours de la semaines, ( 0  = Lundi, 1  = Mardi, ... 6  = Dimanche)
  6.   $horaire = $db->query('SELECT * FROM '.TABLE_HORAIRE_SCAN.' WHERE numJour = WEEKDAY(NOW()) AND heure = HOUR(NOW())');
  7.   if(mysql_num_rows($horaire))
  8.   {
  9.    $result = $db->query('SELECT id, ftp1, ftp2, portFtp FROM '.TABLE_USER.'');
  10.    $nbreProprios = mysql_num_rows($result);
  11.    // on met un temps d'exécution pour le script "raisonnable" (30sec c'est longtemps pas assez!)
  12.    set_time_limit(400);
  13.    // on enlève les warnings...car sinon ca emmerde :-S
  14.    error_reporting(~E_WARNING);
  15.    while ($row = mysql_fetch_assoc($result))
  16.    {
  17.     // Champs nécessaire au test online ou pas
  18.     $ftp1 = $row["ftp1"];
  19.     $ftp2 = $row["ftp2"];
  20.     $portFtp = $row["portFtp"];
  21.     // Champs nécessaire à l'ajout dans la table de stat
  22.     $idProprios = $row["id"];
  23.     $openOrNot = '';
  24.     if(ServerOnline($ftp1, $ftp2, $portFtp))
  25.     {
  26.      //si le serveur du proprios est online, openOrNot vaut 0
  27.      $openOrNot = '0';
  28.     }
  29.     else
  30.     {
  31.      //sinon openOrNot vaut 1
  32.      $openOrNot = '1';
  33.     }
  34.     // et on insère le résultat avec l'id du proprios dans la table 'onlinestats'
  35.     $db->query('INSERT INTO '.TABLE_ONLINESTATS.' SET idProprios = '.$idProprios.', date = NOW(), online = '.$openOrNot.'');
  36.    }
  37.    // et on supprime les enregistrements vieux de 3 mois et +
  38.    $db->query('DELETE FROM '.TABLE_ONLINESTATS.' WHERE MONTH(date) < (MONTH(NOW()) - 3)');
  39.    echo  '<br><br>
  40.       -> '.$nbreProprios.' serveurs scannés<br>
  41.       -> Stats pour chaque proprios updaté<br>
  42.       -> Stats de plus de '.$dureeAncienStats.' mois supprimés<br>';
  43.   }
  44.   else
  45.   {
  46.    echo 'Ce n\'est pas l\'heure pour faire un scan :-D !';
  47.   }

ce script permet de savoir si des serveur FTP sont online en se basant sur une table horaire (avec pour chaque jour des horaires de scann différent)
 
Si qqn a une idée... ? Merci d'avance.
 
@++


Message édité par le_duc le 25-10-2005 à 19:01:07
Reply

Marsh Posté le 16-10-2005 à 20:47:29   

Reply

Marsh Posté le 16-10-2005 à 21:16:52    

Mmmm c'est pas toi qui a fait le script non?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 16-10-2005 à 21:19:27    

si, pkoi?

Reply

Marsh Posté le 16-10-2005 à 21:21:51    

Disons que ca me semble assez soffisitqué pour qqn qui arrive pas a debugger son propre script...  A part ca , a 1ere vue je vois rien qui doit boucler a l'infinit en cas d'une version differente ... T'es sur que c'est la que ca boucle?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 16-10-2005 à 21:28:55    

bah, ca fait qd même 2 ans que je suis une école d'informatique... bon on fait pas de PHP, mais qd on a les bases, ca va ;) :)
 
Et normally j'arrive à debugger moi-même, mais là j'ai déjà essayé plein de trucs, dont l'inclusion d'un compteur dans la boucle qui devrait arreter celle-ci lorsque le nombre d'enregistrement de la requete sql est atteint, mais ca continue qd meme :pt1cable:
 
je suis pas sûr que ce soit la boucle en elle-même qui foire...

Reply

Marsh Posté le 16-10-2005 à 21:42:26    

deja enleve l'effacement des warning peut etre que tu auras plus d'infos...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 16-10-2005 à 21:52:43    

alors si je laisse les Warnings, j'ai ca:
 

Code :
  1. Warning: fsockopen(): unable to connect to xxx.xxx.xxx:21 in e:\mes documents\mes sites web\sparta-proprios v2\stats.php on line 175
  2. Warning: fsockopen(): php_network_getaddresses: gethostbyname failed in e:\mes documents\mes sites web\sparta-proprios v2\stats.php on line 175

ligne 175 = 1er fsockopen de la fonction ci-dessous!

  • le 1er Warning est normal...pasque si il arrive pas a se connecter à un serveur (p.e. offline), il me met ce Warning
  • le 2e, je sais pas trop ce que c'est...


 
la fonction qui émet les warning (au cas ou ;))

Code :
  1. function ServerOnline($ftp1, $ftp2, $portFtp)
  2. {
  3.  $fp = fsockopen ($ftp1, $portFtp, $errorNo, $errorStr, 3);
  4.  if($fp)
  5.  {
  6.   return true;
  7.  }
  8.  else
  9.  {
  10.   // puis on ouvre sur l'adresse de secour
  11.   if($ftp2 != '')
  12.   {
  13.    $fp = fsockopen ($ftp2, $portFtp, $errorNo, $errorStr, 3);
  14.    if($fp)
  15.    {
  16.     return true;
  17.    }
  18.    else
  19.    {
  20.     return false;
  21.    }
  22.   }
  23.  }
  24.  fclose($fp);
  25. }


Message édité par le_duc le 16-10-2005 à 22:22:56
Reply

Marsh Posté le 17-10-2005 à 12:52:51    

c'est ca qui merde :
 

Code :
  1. error_reporting(~E_WARNING);


 
je capte vraiment pas! en local cette ligne ne fait rien de spécial (elle enlève les warnings koi...) et online elle fait tourner tout le script en boucle....???!!!!

Reply

Marsh Posté le 17-10-2005 à 12:59:53    

// on enlève les warnings...car sinon ca emmerde :-S
error_reporting(~E_WARNING);


 
[:johneh] [:johneh] [:johneh] P'tain y'a des fois...

Reply

Marsh Posté le 17-10-2005 à 14:40:47    

en fait faut que je mette la ligne suivante sinon ca tourne en boucle :
 

Code :
  1. error_reporting(E_WARNING);


 
mais c over-chiant tout ces warnings... surtout que ces des warnings "logique"!! -> si il ne peut pas se connecter à un serveur, il émet un warning... mais je m'en fous moi! :D

Reply

Marsh Posté le 17-10-2005 à 14:40:47   

Reply

Marsh Posté le 17-10-2005 à 14:45:41    

Ben s'il peut pas se connecter à un serveur, alors il faut un fallback qui va par exemple stopper le script et afficher un message d'erreur, ou faire quelque chose d'autre. On peut aussi mettre une belle arobase devant la fonction pour éviter les messages d'erreurs. Mais surtout pas reposer sur des pfüsch dans ce genre :(

Reply

Marsh Posté le 17-10-2005 à 15:10:54    

t'aurais un exemple ou doc pour faire les trucs que tu dis?
 
pasque moi à part les try-catch, je connais rien :D
 
thx, @++

Reply

Marsh Posté le 17-10-2005 à 15:15:34    

php.net [:spamafote]

Reply

Marsh Posté le 17-10-2005 à 15:24:24    

ahhhh donc qd on met un "@" devant une fonction, ca bloque les erreurs ?  
 
c cool ca :)

Reply

Marsh Posté le 17-10-2005 à 15:27:27    

Ouais enfin ça veut pas dire qu'il faut en mettre partout ;) C'est à utiliser que dans certains cas particuliers...

Reply

Marsh Posté le 17-10-2005 à 18:00:02    

bon c'est quand même trop trop trop bizarre cette histoire!!!
 
Voilà le script avec les fsockopen():

Code :
  1. function ServerOnline($ftp1, $ftp2, $portFtp)
  2. {
  3.  $temp = error_reporting(E_WARNING);
  4.  $fp = fsockopen ($ftp1, $portFtp, $errorNo, $errorStr, 3);
  5.  if($fp)
  6.  {
  7.   return true;
  8.  }
  9.  else
  10.  {
  11.   // puis on ouvre sur l'adresse de secour
  12.   if($ftp2 != '')
  13.   {
  14.    $fp = fsockopen ($ftp2, $portFtp, $errorNo, $errorStr, 3);
  15.    if($fp)
  16.    {
  17.     return true;
  18.    }
  19.    else
  20.    {
  21.     return false;
  22.    }
  23.   }
  24.  }
  25.  fclose($fp);
  26.  error_reporting($temp);
  27. }


 
Comme ca ca fonctionne nickel! (mais ca m'affiche plein de warning -> unable to connect... mais ca c normal)
 
Maintenant si j'ajoute juste un "@" devant fclose($fp); , ca tourne en boucle.... jusqu'à ce que le temps limite de l'exécution du script soit atteint! (idem si j'ajoute un "@" devant les fsockopen()!)
 
:?:


Message édité par le_duc le 17-10-2005 à 18:01:25
Reply

Marsh Posté le 17-10-2005 à 18:03:15    

Salut,
 
réduit le temps alloué avant que ta fonction retourne une erreur :
 
http://fr.php.net/manual/fr/functi [...] imeout.php

Reply

Marsh Posté le 17-10-2005 à 18:09:16    

anthomicro a écrit :

Salut,
 
réduit le temps alloué avant que ta fonction retourne une erreur :
 
http://fr.php.net/manual/fr/functi [...] imeout.php


 
en ajoutant cette ligne juste après les 2 ligne de fsockopen(), ca me fait encore plus de warnings....  :pt1cable:  
 

Code :
  1. stream_set_timeout($fp, 2);


Message édité par le_duc le 17-10-2005 à 18:13:34
Reply

Marsh Posté le 18-10-2005 à 12:15:59    

alors juste 2 trucs:
 
1. fermes le socket que s'il a été ouvert - logique, non ? et hop un Warning en moins
2. utilises un @ sans soucis sur fsockopen, comme décrit plus haut, parce que cette fonction permet de renvoyer un numéro d'erreur, et fais ton contrôle d'erreur sur ce $errno, 0 => tout va bien, 10060 => timeout, no response, les autres à voir ...
 
donc :  
[pseudocode]
serverOnline()
je tente silencieusement d'ouvrir un socket
si le socket a été ouvert, je le ferme, je renvoi 0
si le socket n'a pas été ouvert, J'ESSAYE PAS DE LE FERMER, et je renvoi $errno et/ou $errstr
 
boucle($ips)
pour toutes mes IPs, si serverOnline() est 0, c'est cool, sinon je sais avec $errno/$errstr pourquoi ça n'a pas fonctionné
[/pseudocode]

 
et peut-être qu'un set_time_limit ( nombre_vachement_grand_voir_zero ); vaudrait le coup, ou tu as p.e. un système de point de récup. en cas d'arrêt brutal de l'exe ...

Reply

Marsh Posté le 19-10-2005 à 20:49:14    

shakpana a écrit :

alors juste 2 trucs:
 
1. fermes le socket que s'il a été ouvert - logique, non ? et hop un Warning en moins
2. utilises un @ sans soucis sur fsockopen, comme décrit plus haut, parce que cette fonction permet de renvoyer un numéro d'erreur, et fais ton contrôle d'erreur sur ce $errno, 0 => tout va bien, 10060 => timeout, no response, les autres à voir ...
 
donc :  
[pseudocode]
serverOnline()
je tente silencieusement d'ouvrir un socket
si le socket a été ouvert, je le ferme, je renvoi 0
si le socket n'a pas été ouvert, J'ESSAYE PAS DE LE FERMER, et je renvoi $errno et/ou $errstr
 
boucle($ips)
pour toutes mes IPs, si serverOnline() est 0, c'est cool, sinon je sais avec $errno/$errstr pourquoi ça n'a pas fonctionné
[/pseudocode]

 
et peut-être qu'un set_time_limit ( nombre_vachement_grand_voir_zero ); vaudrait le coup, ou tu as p.e. un système de point de récup. en cas d'arrêt brutal de l'exe ...


 
yes, merci pour tes conseils!
 
j'ai tjs un problème de répétition... tous les serveur sont scannés 2x  :pt1cable:  alors qu'en local ils sont scannés qu'1x (ce qui est normal!). J'espère que tes conseils arrangeront tout ca  :jap:

Reply

Marsh Posté le 19-10-2005 à 23:55:44    

le_duc a écrit :

j'ai tjs un problème de répétition... tous les serveur sont scannés 2x  :pt1cable:  alors qu'en local ils sont scannés qu'1x

oui, c'est louche ...  
mais une fois que tu auras un contrôle d'erreur digne de ce nom, fais-toi une fonction de log, genre debugLog($data) qui stockera dans un fichier (à l'écran, ou ailleurs, m'en fout moi...) tout les évènements que tu juges interressant, ça devrait te permettre de voir à moment ça boucle ?! Parce que la question est "qu'est-ce qui boucle, où ça boucle, et qd ça boucle ?" Tout le tableau -> parsé 2 fois, chaque enregistrement un à un, chaque appel de serverOnline() ? ou ... ?


Message édité par shakpana le 19-10-2005 à 23:56:05
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed