Statuts d'un serveur distant en PHP

Fermé
joboy - 15 mai 2008 à 07:50
 nabla - 15 mai 2008 à 10:06
Bonjour,

J ai créé un script qui me permet de vérifier si un serveur distant en ligne ou hors ligne.

Cela fonctionne bien mais le probleme est que j'ai environs 90000 adresses ip de serveurs distant à vérifier, et la, cela me vérifie chaque ip, une à une.

Existe t il un moyen en php pour faire en sorte que cela vérifie plusieurs ip en même temps? Sinon, quel langage serait approprié pour faire cela?

Je suis sur un serveur qui tourne avec linux...

[code]<?php
//Fixe le temps maximum d'exécution d'un script et court circuite parametre du serveur
set_time_limit(0);

$filename = "dbconnect.php";
if (file_exists($filename)) include($filename);

$total = mysql_query("SELECT COUNT(*) FROM listeIp") or die ("Requete impossible" );
$count = mysql_fetch_array($total);
$numero = $count[0];

$sql=mysql_query("SELECT adresseIp FROM listeIp")or die(mysql_error());

$i=0;

echo"Nombre total de serveurs proxy à vérifier: $numero <p>";

while ($data = mysql_fetch_array($sql))
{
$fp = fsockopen($data['adresseIp'], 80, $errno, $errstr, 10);

//Si la connection échoue
if (!$fp)
{
$supr= mysql_query("DELETE FROM listeIp WHERE adresseIp='".$data['adresseIp']."'") or die('Impossible de supprimer les données de la base'.mysql_error());
$i++;
echo"Serveur numéro $i : ".$data['adresseIp']." supprimé <BR>";
}
else
{
$enLigne= mysql_query("UPDATE listeIp SET DateInsertion=NOW() WHERE adresseIp='".$data['ip']."'") or die('Impossible de mettre les données de la base à jour'.mysql_error());
$i++;
echo"Serveur numéro $i : ".$data['adresseIp']." toujours fonctionnel <BR>";
fclose($fp);
}

}
?>/code
A voir également:

3 réponses

perso je ferai un programme em C++, C#, python... ou ce que tu veux...
et au lieu de tester un a un tes serveurs, tu lance la patate de thread en meme temps.. bon, tu pourra pas en ouvrir 90 000 en meme temps, mais deja tu peux reduire tes temps de test....

je sais pas si il est posssible de faire du multithreading en PHP ... ce serait le plus simple pour toi ...
0
http://www.noisette.ch/wiki/index.php/PHP/Multithread

je sais pas ce que ca vaut... a tester...
0
Bonjour Nabla,

Merci pour tes réponses.

J'avais effectivement déjà trouvé des post qui indiquaient qu'on pouvait faire des simulation de mutithread en php, mais après renseignements, on m'avait dit que cela bouffe beaucoup de ressources et que c'est loin d'être une bonne méthode.

Sinon, je vais me mettre à apprendre un autre langage...Peut etre python, j en ai souvent entendu parler dans mes recherches pour faire du multithread...

Merci encore
0
en c++ avec les MFC (microsoft foundation class), pas top mais bon, pas trop chiant a utiliser:

#include "afxsock.h"
#include "afxmt.h"
#define PORT 80
CMutex mutex; //declaration du mutex

UINT travail(LPVOID sock);
void main(){ //thread principal (écoute)
AfxSocketInit(); //initialisation des sockets
//recuperrer la liste des serveurs
for (int a = 0; a<100; a++) //on lance une bonne centaine de thread
AfxBeginThread(travail,(LPVOID)&liste);//lance la fonction travail comme nouveau thread,
}
}

UINT travail(LPVOID liste){ //thread de travail
CSocket *Wsocket=new CSocket; //socket de travail
WSocket->create();
int ip;
mutex.Lock();//mutex pour eviter les conficts d acces au ressources....
//lire le prochain element de la liste, et le mettre dans la variable ip;
mutex.Unlock();//si tu fait pas ca, tu ne testera jamais plus que la première ligne !!!!

WSocket->Connect(ip,80);
//ici il faudra gerer soit un timeout, soit l erreur renvoyee par la socket...
}



voila... pas testé, mais c est l idée.. il faut ajouter la gestiond de ta base de données...
pour les autres languages, desolé, je ne peux pas vraiement t aider
0