Partage
  • Partager sur Facebook
  • Partager sur Twitter

Script php en boucle et actualisation

27 juin 2013 à 16:56:04

Bonjour,

Je n'y connait rien en js alors soyez tolérants :p

J'ai actuellement une page PHP qui contient une table remplie par MySQL.

Il s’agit d'un recensement des machines d'un parc informatique.

Jusque là, tout marche bien, connexion, requête, etc

Je voudrais rajouter une colonne (déja fait sur la table) qui me donnerait un status en fonction d'un ping

J'ai fait le script et il marche, il met bien à jour la table MySQL.

Par contre, je voudrais intégrer tout ensemble, et actualiser l’état des machines toutes les x secondes (le temps que le script s’exécute en fait, ça prend genre 10s, y'a ~150 machines à pinger)

Voila le script:

(nom: scriptIp.php)

<?php	

//------- Création liste IP dans ipList.txt

	$file = fopen('ipList.txt', 'w');
	while($data = mysql_fetch_assoc($req))
	{	
		fputs($file, $data['IPADDR']."\n");
	}
	fclose($file);
	
//------- Verification dispo ipList & execution de fping + exportation dans ipUp.txt

	while (!is_writable('ipList.txt')) { 
		sleep(0.5);
	}
	`fping -a < ipList.txt > ipUp.txt`;
	
//------- Verification dispo ipUp
	
	while (!is_writable('ipUp.txt')) { 
		sleep(0.5);
	}

//------- Lecture ipUp vers tableau

$tableauIP = file('ipUp.txt');

//------- Envoi de la requête

$sqlReset = 'UPDATE hardware SET STATUSPING=\'DOWN\'';
$reqReset = mysql_query($sqlReset) or die('Erreur SQL !<br>'.$sqlReset.'<br>'.mysql_error());

foreach ($tableauIP as $ipOK)
{
        $ipOK = trim($ipOK);
        $sqlUP = 'UPDATE hardware SET STATUSPING=\'UP\' WHERE IPADDR=\''.$ipOK.'\'';
        $reqUP = mysql_query($sqlUP) or die('Erreur SQL !<br>'.$sqlUP.'<br>'.mysql_error());
}


?>
	

et voila la page ou je veux l'insérer:

(nom: status.php)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<?php include 'sqlConnect.php'; ?>
<?php include 'scriptIp.php'; ?>
<?php include 'query.php'; ?>

<html>
	<head>
		<title>OCS</title>
		<link rel="stylesheet" href="ocsStyle.css">
	</head>
	<body>		
		<h2><u>LAN STATUS</u></h2>
		<br>
		
		<table>
			<tr>
				<td id=tdTitre>Status</td>
				<td id=tdTitre>Machine</td>
				<td id=tdTitre>Nom</td>
				<td id=tdTitre>Openspace</td>
			</tr>

			<?php
				while($data = mysql_fetch_assoc($req))
				{	
					echo '
					<tr>
					
					<td>'.$data['STATUSPING'].'</td>
					<td>'.$data['NAME'].'</td>
					<td>'.$data['NAMEconst'].'</td>
					<td>'.$data['OPENSPACE'].'</td>
					
					</tr>';
				}
			?>
			
		</table>
	</body>
</html>

<?php include 'sqlClose.php'; ?>



Voila, actuellement cette configuration ne marche pas parce que le script prend trop longtemps à s’exécuter et du coup la page charge avant la fin, enfin peut importe...

Je voudrais que le script s’exécute en continu en tache de fond, et que chaque fois qu'il se termine il mettre à jour juste les status des machines, et pas toute la page

C'est bien du js qu'il faut utiliser ?
   

  • Partager sur Facebook
  • Partager sur Twitter
27 juin 2013 à 23:28:55

Ce que tu veux faire me semble assez compliqué et je ne suis pas sur de pouvoir t'aider mais je pense qu'il faut que tu utilise de l'Ajax. L'Ajax te permet de faire exécuter du php sur un serveur après avoir chargé une page sur un client. Utiliser de l'ajax revient bien à utiliser du js.

En gros à ta place j'écrirai un truc comme ça en js:

var temps = 12000 //temps (en ms) que tu estimes pour que ton scriptIp s'exécute

$(document).ready(function() {
    refresh(); // tu n'as donc plus besoin de faire un include
var boucle = setInterval(refresh, temps) // la fonction refresh va donc s'exécuter tout les "temps" }); function refresh(){ $.ajax({ type: "POST", url: "scriptIp.php", data: "donnee="+"mes_donnee", // dans ta page scriptIp.php une variable $_POST['donnee'] sera créer (ici ça n'as pas vraiment d'utilité...) success: function(msg){ /* s’exécute quand le php a fini de s'exécuter (d’après ce que je sais)*/ } }); } // Cette fonction de permet "d'activer" ta page php.

Ce script utilise du jquery (une extension du javascript qui simplifie la vie) donc il faut que tu mettes ça dans ta balise head:

<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>

Je te conseille de regarder les fonctions ajax jquery: http://www.jquery-fr.com/manuel/Les-fonctions-AJAX/

 et de lire le tuto javascript du sdz au moins le début.

-
Edité par artgame 27 juin 2013 à 23:41:41

  • Partager sur Facebook
  • Partager sur Twitter
28 juin 2013 à 9:16:42

Salut, Merci de m'aider :)

Dans ce que tu me propose, mon scriptIp va s’exécuter en fonction du temps, vu que le nombre d'ordinateur et leurs temps de réponse est variable (c'est ça qui va déterminer la durée d’exécution).

Je vais tester ce que tu m'a donné.

EDIT: Je viens de parcourir les tutos,

Je ne sais pas si c'est possible, mais je voyais plus ça comme ça:

première solution:

- quand le client charge la page, il demande au serveur de charger le scriptIp

- le scriptIp s’exécute en boucle tout seul , et chaque fois qu'il se termine, il envoie un signal au client

- chaque fois il reçoit le signal le client actualise les champs qui changent (=il récupère les données MySQL)

- quand l'utilisateur quitte la page, il indique au serveur que le scriptIp doit d’arrêter

2e solution (surement plus simple):

Mettre une variable dans scriptIp qui passe à true quand c'est terminé

Le code js attend que cette variable soit à true pour relancer le scriptIp, et la passe à false quand il se relance

(je sais pas si c'est clair, c'est difficile à expliquer)

-
Edité par wongounet 28 juin 2013 à 10:01:02

  • Partager sur Facebook
  • Partager sur Twitter
28 juin 2013 à 9:57:21

Oui en fait j'y avais pas pensé mais la fonction décrite après "sucess:" s'exécute dès que scriptIp.php est terminé. Donc si tu fait ça:

$(document).ready(function() {
    refresh();
});
 
function refresh(){
    $.ajax({  
        type: "POST",   
        url: "scriptIp.php",   
        data: "donnee="+"mes_donnee",
        success: function(msg){ refresh(); }
    });
} 


ça peut marcher mais à mon avis il faut que tu résolves ce problème pour que ça marche : "Voila, actuellement cette configuration ne marche pas parce que le script prend trop longtemps à s’exécuter et du coup la page charge avant la fin, enfin peut importe..."

Par ailleurs si tu veux que les ping soit mis à jour en temps réel, il faut que tu écrives quelques choses comme ça dans ton php:

echo  implode(",", $tableauIP);

Cette chaîne de caractère sera récupérée dans la variable msg sur ta page status.php

C'est la case STATUSPING que tu veux mettre à jour c'est ça?

-
Edité par artgame 28 juin 2013 à 9:59:04

  • Partager sur Facebook
  • Partager sur Twitter
28 juin 2013 à 10:23:00

Je ne comprends pas pourquoi tu veux faire un implode, ça va juste balancer 150 ips les unes après les autres séparées pas des virgules.

En gros, il faut que le script tourne en fond sans influer sur la page (je crois que ça c'est ce que tu m'a donné)

Ensuite, l'idéal se serait de savoir quand il se fini, mais je peux actualiser toutes les 5 secondes, et au pire ça actualisera pour rien

D'ailleurs il va falloir utiliser de l'AJAX pour faire du PHP qui fait une requête SQL (pour mettre à jour le champ)

Pour rappel scriptIp fait des pings et met à jour le champ STATUSPING dans la BDD. son exécution prend ~10s, donc j'aurais jamais les pings en temps réel ^^

C'est la case STATUSPING que tu veux mettre à jour c'est ça?

-> Oui

-
Edité par wongounet 28 juin 2013 à 10:31:48

  • Partager sur Facebook
  • Partager sur Twitter
28 juin 2013 à 11:42:59

Ok ok...

Tu veux qu'il se passe ça (dans l'odre chronologique:):

1) le client charge la page status.php 

2) scriptIp.php se lance

3) scriptIp.php se termine

4) le client (la page status.php) envoie une requête ajax et récupère les nouveaux ping.

5) une fonction js de la page status.php met tes cases <td> $data['STATUSPING'] </td> à jour grâce au donnée récupérer en 4) 

6) on recommence à la 2) :)

Donc pour la 4) il faut que tu crée un script php qui parcours ta db pour récupérer les ping.

et que tu crée une fonction js ajax qui récupère active ce script et récupère les ping, les mettent dans un tableau et les envoie la fonction en 5) (nouveaux_ping)

pour la 5) je ferais un truc du genre:

function update(nouveaux_ping){
  var ping;
  var all_td = $('tr td.ping')
  //récupère tout les éléments td contenant un ping
  
  for(var i=0; i<nouveaux_ping.length ; i++){
    ping=nouveaux_ping[i];
    $(all_td[i]).html(ping);
    //cette instruction sélectionne le case à modifié et la modifie 
  }

}


J'ai bien compris?

-
Edité par artgame 28 juin 2013 à 11:43:48

  • Partager sur Facebook
  • Partager sur Twitter
28 juin 2013 à 11:58:30

Le problème, c'est que là, tu veux faire les choses à l'envers. Faire passer le client pour le serveur et inversement. Dès que le serveur a fini d'exécuter sa fonction il envoi un message au client. (le principe des notifications push)

Je ne connais rien en PHP qui permette de le faire (bien qu'il y ai sans doute des serveurs qui le permette).

Tu peux le faire avec node.js par exemple sinon ;) 

  • Partager sur Facebook
  • Partager sur Twitter
28 juin 2013 à 13:05:23

mais le php envoie quelques choses (un changement de statu je crois) au client dès qu'il a finit d'exécuter sa fonction. C'est ce quelques chose qui active la fonction décrite après "sucess:" dans la fonction ajax jquery.

J'ai fait une sorte de simulation des étapes décrites dans mon précédent message :

http://www.tpe-metamateriaux.fr/test_sdz/status.html

cette page fonctionne avec deux script php: 

scriptIp.php qui simule le test des pings et la mise à jour de la db(en un peu plus court: 2 seconde) : 

<?php

sleep(2);

?>

et get_pings.php qui récupère les pings (ici les génère aléatoirement):

<?php
header("Content-Type: text/plain"); 

$pings = array(rand(5, 15) ,rand(5, 15),rand(5, 15));

echo implode(",",$pings);
?>

Il n'y a plus qu'a refaire cette architecture en mettant les bons codes (le vrai test des ping + les requête MySql) dans ces deux pages.

 Est-ce que tu comprends comme tout ça marche , wongounet? 

Regardons le javascript de status.html, j'ai 3 fonctions:

refresh() qui active scriptIp.php

get_ping() qui récupère les ping grâce à get_pings.php (dans lequel tu exécuteras une requête ajax)

update(nouveaux_ping) qui modifie le html en mettant à jour le tableau avec les nouveaux ping.

-
Edité par artgame 28 juin 2013 à 14:26:26

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
28 juin 2013 à 13:10:25

Et pourquoi ce serait une requête Ajax qui lancerait un traitement aussi lourd ?

Si tu veux automatiser une tâche régulière autant passer par un CRON.

Et en Ajax tu n'auras plus qu'à récupérer les données de ta BDD.

  • Partager sur Facebook
  • Partager sur Twitter
28 juin 2013 à 13:13:43

peut-être bien... je ne suis pas aussi expérimenté que toi et je ne sais pas ce qu'est un CRON :/

PS: c'est vrai que d'après ce que j'ai vu sur Google, ça correspond à nos besoins. Mais bon, je pense que mon script peut marcher, c'est déjà ça ^^

-
Edité par artgame 28 juin 2013 à 13:33:40

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
28 juin 2013 à 13:28:44

Une méthode consisterais à lancer le script status.php grâce à une requête ajax au chargement de la page pour afficher les status(*) lors de la réponse du serveur (c'est-à-dire au bout des ~10 secondes). Alors une nouvelle requête pourrait être lancée pour actualisation.

Voici un script (inspiré de celui de Peter-Paul Koch) fournissant la fonction ajax sndRqt (à insérer de préférence à la fin du body - beaucoup moins lourd que le 94kO de jQuery)

(function(){
	var xmlObj=false;
	var xmlFct=[function(){return new XMLHttpRequest()}
		,function(){return new ActiveXObject("Msxml2.XMLHTTP")}
		,function(){return new ActiveXObject("Msxml3.XMLHTTP")}
		,function (){return new ActiveXObject("Microsoft.XMLHTTP")}];
	for (var i=0;i<xmlFct.length;i++) {try{xmlObj = xmlFct[i]();}catch(e){continue;}break;}
	
	return sndRqt=function(url,cllbck,pstDta){
		var req=xmlObj;
		if (!req) return;
		var mth=(pstDta)? "POST":"GET";
		req.open(mth,url,true);
		req.setRequestHeader('User-Agent','XMLHTTP/1.0');
		if (pstDta) req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
		req.onreadystatechange=function(){
			if (req.readyState!=4) return;
			if (req.status!=200 && req.status!=304) return;
			cllbck(req);}
		if (req.readyState==4) return;
		req.send(pstDta);
	};
}());

L’exécution de cette fonction définit, une fois pour toute l'objet du navigateur le mieux adapté aux requêtes et ne renvoie que la fonction précitée sndRqt sans salir l'espace de travail (l'espace local de la fonction anonyme est seul utilisé).

Alors une simple instruction en fin de script permettrait de lancer la fonction d'affichage des réponses (si un ou plusieurs paramètres devaient être passés au serveur ceci devrait se faire en prolongeant le non du fichier (ou chemin et) par une chaîne (? puis &)clef=encodeURIComponent(valeur) pour une requête GET ou simplement clef=valeur&... en troisième argument pour une requête en POST)

sndRqt('status.php',fncRps);

function fncRps(r){// fonction dite de callback appellée lors de la réponse
   alert(r.responseText) // À titre de test
   // Affichage de la requête
   // Puis relance de la requête suivante
   sndRqt('status.php',fncRps):
}

(*) Afin d'alléger la réponse le fichier status.php pourrait ne renvoyer qu'une simple chaîne de caractères telle que celle-ci :

'STATUSPING0|NAME0|NAMEconst0|OPENSPACE0|STATUSPING1|NAME1|NAMEconst1|OPENSPACE1|... STATUSPING150|NAME150|NAMEconst150|OPENSPACE150|';

Qu'il serait facile de lire après transformation en tableau, le split('|'), et lecture au pas de 4. La fonction de callback deviendrait alors

function fncRps(r){
   var idx,chn=r.responseText.split('|'),lng=chn.length; 
   for (idx=0;idx<lng;i+=4) { 
      // Affichage des résultats avec les 4 champs 
      chn[i], chn[i+1], chn[i+2] et chn[i+3] 
   }
   sndRqt('status.php',fncRps);
}

-
Edité par Anonyme 28 juin 2013 à 13:41:49

  • Partager sur Facebook
  • Partager sur Twitter
1 juillet 2013 à 10:04:21

Merci à tous pour l'aide.

En toute franchise, ça commence à me faire peur, je crois que j'ai pas le niveau pour tout comprendre.

Donc je vais bien tout relire, et faire des essais, je posterai à la suite si j'ai une question.

Si je n'y arrive vraiment pas, c'est pas grave :)

Si je dois me concentrer sur une méthode, ce serait laquelle ? Parce que y'a celles de artgame, de viki53 et de 007Julien

Déjà que ça va me prendre la journée pour bien en comprendre une, autant partir sur la meilleure x)

D'après ce que je vois, à chaque fois vous proposez de récupérer le tableau qui contient les nouvelles IP et de mettre à jour la page avec.

tableauIP -> js -> status.php

Moi j'étais parti sur une actualisation de MySQL (vu que tout est déja fait par rapport à la BDD)

tableauIP -> MySQL -> js -> status.php

Si vous me proposez tous la même méthode, je suppose qu'elle est mieux ?

-
Edité par wongounet 1 juillet 2013 à 10:19:51

  • Partager sur Facebook
  • Partager sur Twitter
1 juillet 2013 à 11:01:39

En fait, la méthode de 007Julien et la mienne sont équivalente. La seule différence c'est que la sienne ne demande pas de charger Jquery (qui pèse 94ko ce qui est quand même assez peu) mais les fonction ajax Jquery sont à mes yeux plus simples. Le Jquery simplifie aussi la vie pour modifier le html dans ton tableau.

la méthode de viki53 peut être une bonne solution mais je crois (viki me corrigera si je me trompe) que les taches CRON ne peuvent pas être utilisé sur un serveur Windows. 

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 juillet 2013 à 11:04:38

Nativement non, il n'y a pas de cron sous Windows. Mais plusieurs méthodes pour obtenir un résultat similaire.

Sinon il y a aussi des services externes qui lancent une URL de façon régulière.

Le problème avec vos méthodes c'est que le client doit attendre le retour des test ping et que si plusieurs clients visitent la page il y a des tests et requêtes inutiles.

Un cron est plus fait pour ça : effectuer une tâche de manière régulière, indépendamment de tout client.

Après il reste au client à lire les données en base, ce qui ne prend que quelques millisecondes.

Rien n'empêche après de faire une mise à jour automatique côté client, rien de bien compliqué.

-
Edité par Anonyme 1 juillet 2013 à 11:08:29

  • Partager sur Facebook
  • Partager sur Twitter
1 juillet 2013 à 11:12:27

C'est un serveur linux donc c'est bon.

Avec CRON, le soucis c'est que ça exécute une tache régulièrement, mais pas sur commande.

Ça pourrait marcher (et ce serait assez simple) de mettre à jour la table MySQL toutes les x minutes, mais je préfère éviter parce que ça risque de flood le réseau. (d'ailleurs CRON se limite aux minutes, donc pas possible de rafraichir toutes les x secondes)

Il faudrait que le scriptIp s’exécute uniquement si besoin est, c'est à dire si quelqu'un consulte la page.

D'ailleurs, cela ne risque pas de poser problème si plusieurs personnes sont sur la page en même temps ? Je veux dire si plusieurs clients lancent l’exécution du scriptIp en même temps ?

Je vais essayer de comprendre ta méthode artgame, elle me parait plus simple.

Pour ta méthode justement, les requêtes SQL à la fin de scriptIp sont inutiles du coup ? puisque tu met à jour la page sans passer par MySQL

@viki53: serait il possible de faire un truc genre:

Tant que la personne est sur le site: exécuter le script toutes les x secondes ? ou même l’exécuter dès qu'il se fini ?

Si oui, il suffirait d'un simple rafraichissement des champs MySQL sur la page toutes les x secondes

PS: tout ça se fait uniquement en local et n'est pas du tout sécurisé, donc le poids n'est pas important

-
Edité par wongounet 1 juillet 2013 à 11:35:36

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 juillet 2013 à 11:36:42

Je ne pense pas, à moins que tu puisses gérer des tâches cron pour les ajouter/supprimer en PHP. Je ne suis pas expert là-dessus.

Par contre une solution serait effectivement d'utiliser l'autre méthode mais d'éviter que plusieurs personnes lansent le script de mise à jour en même temps.

Par exemple en utilisant un bête fichier texte, dans lequel tu mets une valeur au lancement du script et que tu supprimes à la fin. Ça te permet ainsi à chaque appel de ta page de savoir si tu dois lancer la MAJ ou simplement lire les infos en base.

C'est pas l'idéal mais c'est mieux que pire...

-
Edité par Anonyme 1 juillet 2013 à 11:36:56

  • Partager sur Facebook
  • Partager sur Twitter
1 juillet 2013 à 11:53:58

Oui en effet, je n'avais pas pensé à ce cas. Comme l'a dit viki, une solution serait de modifié un peu ton ScriptIp pour qu'il s’exécute normalement si mem.txt (par exemple) contient 0 et qu'il écrive 1 dans mem.txt sinon (si mem.txt contient 1) alors tu fait sleep(10); (pour que le client réessaye dans 10 seconde)

c'est à mon avis une solution assez efficace.

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 juillet 2013 à 11:59:11

Pas sleep, justement, mais un retour des données de la base.

Et le client recharge plus tard dans tous les cas.

Comme ça l'attente est répartie parmi les différents clients et le serveur ne lance qu'une MAJ à la fois.

-
Edité par Anonyme 1 juillet 2013 à 11:59:32

  • Partager sur Facebook
  • Partager sur Twitter
1 juillet 2013 à 12:51:34

@ viki: bah en fait si tu regardes ce que j'ai fait, c'est dans get_pings.php (appelée par ajax juste après status.php) que je fait le retour de la base de donnée.

Bon wongounet, je te propose d'essayer ça et de voir si ça marche:

c'est peut-être pas la meilleure solution mais c'est mieux que rien.

la page status.php:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
 
<?php include 'sqlConnect.php'; ?>
<?php include 'query.php'; ?>
 
<html>
    <head>
        <title>OCS</title>
        <link rel="stylesheet" href="ocsStyle.css">
		<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
		<script type="text/javascript">
$(document).ready(function() {
	refresh(); //quand la page status s'est chargé, refresh() est appelée.
});
  
function refresh(){ // refresh() "active" la page scriptIp.php
	$.ajax({ 
		type: "POST",  
		url: "scriptIp.php",  
		data: "donnee="+"mes_donnee",
		success: function(msg){ get_ping(); } // une fois que scriptIp.php est terminé, la fonction get_ping() est appelée
	});
}

function get_ping(){ // cette fonction récupère une chaine de caractère 
	$.ajax({ 
		type: "POST",  
		url: "get_pings.php",  
		data: "donnee="+"mes_donnee",
		success: function(pings){ var tab_pings = pings.split(","); update(tab_pings); 	refresh(); } 
		/* pings contient une chaine de caractère des pings des différentes machines récupérés dans la db
		mis bout à bout séparé par une virgule je la transforme donc en tableau */
		// puis j'appelle update(tab_pings) pour afficher les résultats
		// puis je recommence la "boucle" en appelant refresh()
	});
}

function update(nouveaux_ping){
	var ping;
	var all_td = $('tr td.ping')
	//récupère tout les éléments td contenant un ping (je leur ai donné la class "ping")

	for(var i=0; i<nouveaux_ping.length ; i++){ //pour chaque ping 
		ping=nouveaux_ping[i];
		$(all_td[i]).html(ping);
		//cette instruction sélectionne le case à modifier et la modifie
	} 
} // cette fonction ne fonctionne que si ta base de donnée est oraginsée comme le tableau ci dessous
		</script>
    </head>
    <body>       
        <h2><u>LAN STATUS</u></h2>
        <br>
         
        <table>
            <tr>
                <td id=tdTitre>Status</td>
                <td id=tdTitre>Machine</td>
                <td id=tdTitre>Nom</td>
                <td id=tdTitre>Openspace</td>
            </tr>
 
            <?php
                while($data = mysql_fetch_assoc($req))
                {  
                    echo '
                    <tr>
                     
                    <td class="ping">'.$data['STATUSPING'].'</td>
                    <td>'.$data['NAME'].'</td>
                    <td>'.$data['NAMEconst'].'</td>
                    <td>'.$data['OPENSPACE'].'</td>
                     
                    </tr>';
                }
            ?>
             
        </table>
    </body>
</html>
 
<?php include 'sqlClose.php'; ?>

le scriptIP.php:

<?php
include('sqlConnect.php')
   
$file_mem = fopen('mem.txt', 'r');
$ligne = fgets($file_mem, 4096);
$mem = substr($ligne, 0);

fclose($file_mem);

if($mem = "0"){
	$file_mem = fopen('mem.txt', 'w');
	fputs($file_mem, "1");
        fclose($file_mem);

	//------- Création liste IP dans ipList.txt
	 
		$file = fopen('ipList.txt', 'w');
		while($data = mysql_fetch_assoc($req))
		{  
			fputs($file, $data['IPADDR']."\n");
		}
		fclose($file);
		 
	//------- Verification dispo ipList & execution de fping + exportation dans ipUp.txt
	 
		while (!is_writable('ipList.txt')) {
			sleep(0.5);
		}
		`fping -a < ipList.txt > ipUp.txt`;
		 
	//------- Verification dispo ipUp
		 
		while (!is_writable('ipUp.txt')) {
			sleep(0.5);
		}
	 
	//------- Lecture ipUp vers tableau
	 
	$tableauIP = file('ipUp.txt');
	 
	//------- Envoi de la requête
	 
	$sqlReset = 'UPDATE hardware SET STATUSPING=\'DOWN\'';
	$reqReset = mysql_query($sqlReset) or die('Erreur SQL !<br>'.$sqlReset.'<br>'.mysql_error());
	 
	foreach ($tableauIP as $ipOK)
	{
			$ipOK = trim($ipOK);
			$sqlUP = 'UPDATE hardware SET STATUSPING=\'UP\' WHERE IPADDR=\''.$ipOK.'\'';
			$reqUP = mysql_query($sqlUP) or die('Erreur SQL !<br>'.$sqlUP.'<br>'.mysql_error());
	}
	
	$file_mem = fopen('mem.txt', 'w');
	fputs($file_mem, "0");
        fclose($file_mem);
}
else{
	sleep(10);
}
 
?>



et la page get_pings.php à placer dans le même répertoire que les deux précédente:

<?php
header("Content-Type: text/plain"); 

include('sqlConnect.php');

//récupération des pings (par sql) que tu places dans un tableau nommé $pings


echo implode(",",$pings);


?>

Voila! j’espère que ça marchera :)

Par contre j'ai peut-être fait des erreurs dans mes scripts php car je ne suis pas habitué à ce langage. 




-
Edité par artgame 1 juillet 2013 à 12:56:49

  • Partager sur Facebook
  • Partager sur Twitter
1 juillet 2013 à 13:12:43

Bon je viens de tester, c'est difficile de dire si ça marche vu que le status des pc ne change pas ...

Mais visiblement y'a déjà un problème: un des pc qui n'était pas up la dernière fois n'avais pas de status, et après lancement de ce que tu m'a donné il n'en a toujours pas, donc ça ne marche pas.

  • Partager sur Facebook
  • Partager sur Twitter
1 juillet 2013 à 15:49:32

essaye de placer alert(msg); après sucess: function(){ ligne 21 ( dans la fonction refresh() ).

normalement ça devrait afficher une boite de dialogue une fois que scriptIp (~10s) a fini de s'exécuter. Qu'y a t-il dedans?

Si ça ne l'ouvre pas ouvre la console web sous firefox ou chrome (clic droit > inspecter l'élément/examiner l'élément > console)

Y a t-il des erreurs affichés? 

  • Partager sur Facebook
  • Partager sur Twitter
15 avril 2014 à 17:43:11

Bonjour,

Moi j'ai une boutique prestashop (version 1.6.0.5) et j'ai un module d'import de produits de mon fournisseur. Malheureusement il ne gère pas les stocks zéro (enfin il ne désactive pas les produits quand ils sont à zéro). je fais régulièrement des requêtes sur ma base dans mon phpmyadmin qui sont:

UPDATE ps_1product_shop SET active=0 WHERE id_product IN (SELECT id_product FROM ps_1stock_available WHERE quantity=0);

et

UPDATE ps_1product_shop SET active=1 WHERE id_product IN (SELECT id_product FROM ps_1stock_available WHERE quantity>0);

J'ai entendu parler qu'on pouvait insérer dans un fichier php un script de ces deux requêtes que je peux mettre dans les tâches cron de mon hébergeur de la manière suivante : placer le fichier .php ou l'on veut dans le dossier ftp puis créer une tâche webcron http://monsiteweb.com/laousetrouvemonfichier/fichierenquestion.php.

Qui pourrait me contruire ce fichier php pour faire appel à ces deux requêtes ?

Cordialement,

Guillaume

  • Partager sur Facebook
  • Partager sur Twitter
15 avril 2014 à 22:10:47

Merci de ne pas déterrer des sujets datant de plus d'un an ! Merci de ta compréhension ;)

  • Partager sur Facebook
  • Partager sur Twitter