[PHP] - Page figée

Parce qu'il en faut pour tout le monde, discutez ici d'ADA, de shell et autres Wolfram...

Modérateur : Francois

Répondre
phdenaujan
Messages : 63
Enregistré le : lun. 5 janv. 2015 21:29

[PHP] - Page figée

Message par phdenaujan » mar. 14 avr. 2015 20:57

Boujour à tous,

N'ayant rien trouvé d'existant, j’écris un script PHP permettant j'afficher et d'enregistrer les codes RFSniffer. Le but étant de permettre l'enregistrement des codes de nouvelles prises par n'importe quel utilisateur. C'est une ébauche, mais il est fonctionnel.

La page fonctionne en 3 temps :

- Vérification et lancement de RFSniffer,
- Entrée dans la boucle pour récupération des codes,
- Affichage et sauvegarde des codes

Problème : Dès qu'il entre dans la boucle, la page fige jusqu'à en sortir (de la boucle). Est-il possible de la faire tourner en fond de tache permettant ainsi d'afficher au fil de l'eau les codes reçus ?

Par la suite, les codes récupérés seront envoyer vers une base de données pour être utilisés sur d'autres pages de config ou directement par des scripts (python par exemple) et RFSniffer sera fermé.

Code : Tout sélectionner

<?php
					
					$pid = shell_exec ('ps -e | grep RFSniffer');
					$pid = (preg_split("/[\s,]+/", $pid));
										
					if ($pid[1] == 0)
						{
							$rfsnif = shell_exec ('sudo /home/pi/433Utils/RPi_utils/./RFSniffer > /dev/null &');
						}
					
					// Effacer le ficher recu.txt
					$fp = fopen('/home/pi/recu.txt',"w");
					fputs($fp,"");
					fclose($fp);
					
					// Création des tableaux de réceptions de codes
					$commandes = array();
					$tableau = array();
					$tableau2 = array();
					
					while ($i < 6) //Boucle pour 6 codes
						{							
							$fp = fopen('/home/pi/recu.txt',"r");
							$commandes = fgets ($fp);
							fclose($fp);
						
						if ($commandes != "")
							{
								if (in_array($commandes, $tableau))            //Vérifie les doublons
									{
										array_push($tableau2, $commandes);
									}
								else
									{
										array_push($tableau, $commandes);
										$i = $i+1; //Valide la reception du code
									}
							}
						}
						
						//Affiche
						echo 'Prise 1 on : '.$tableau[0].'-- Prise 1 off : '.$tableau[1].'<br />';
						echo 'Prise 2 on : '.$tableau[2].'-- Prise 2 off : '.$tableau[3].'<br />';
						echo 'Prise 3 on : '.$tableau[4].'-- Prise 3 off : '.$tableau[5].'<br />';
												
						//Souvegarde
						$fp = fopen('config/recu.txt',"w");
						fputs($fp,$tableau[0]."\n");
						fputs($fp,$tableau[1]."\n");
						fputs($fp,$tableau[2]."\n");
						fputs($fp,$tableau[3]."\n");
						fputs($fp,$tableau[4]."\n");
						fputs($fp,$tableau[5]."\n");
						fclose($fp);

					?>
Cordialement,
Ph.

domi
Administrateur
Messages : 3230
Enregistré le : mer. 17 sept. 2014 18:12
Localisation : Seine et Marne

Re: PHP - Page figée

Message par domi » mer. 15 avr. 2015 08:44

Bonjour,

J'ai rapidement regardé ton code, et en effet, étant du code exécuté coté serveur, il est normal que ta boucle effectue 6 relevés avant de retourner le résultat au navigateur.
La page n'est pas figée, le code est simplement en cours d’exécution, et tant qu'il n'a pas terminé, rien n'est envoyé au navigateur.

Si tu veux effectuer plusieurs relevés, et afficher au navigateur le résultat un par un, au fur et à mesure des relevés, il faut avoir recours à la technologie AJAX.

A la place de ta boucle, tu places une DIV, qui contiendra par la suite les valeurs de tes relevés au fur et à mesure de leurs arrivés.
Un code Javascript qui va exécuter la boucle lectures, et lancer le relevé de la valeur via un autre fichier Php. A la fin du script Php, il faut effectuer un "echo" de la valeur qui sera récupérée par Javascript, puis envoyé au navigateur dans ta DIV.

J’espère avoir été assez clair,
Cela n'est pas très difficile,
il va d’ailleurs que je fasse quelque chose de similaire pour les besoins de mon projet WsPiDroid.

Cdt,
Domi
Passionné de Raspberry, Arduino, ESP8266, ESP32, et objets connectés :
Spécial débutant, concevez vous-même votre domotique DIY : https://www.youtube.com/c/DomoticDIY
Conception d'une station météo DIY, et envoi des infos à votre Domotique.

phdenaujan
Messages : 63
Enregistré le : lun. 5 janv. 2015 21:29

Re: PHP - Page figée

Message par phdenaujan » mer. 15 avr. 2015 19:18

Merci Domi,

Parfaitement clair et tout à fait logique en effet.Par contre, je ne connais rien à Javascript (et encore pas grand chose en PHP).

Penses-tu qu'il soit possible de lancer une page PHP en fond de tache lors de l'ouverture d'une autre page ? Non pas que Javascript ne me plaise pas mais je potasse déjà Linux, Python et PHP en simultané, je risque à tout moment le burnout voir pire des trucs du genre :

Code : Tout sélectionner

if (x = 3 :
     print ("x vaut 3";
elseif :
     echo 'x ne vaut pas 3 !'
}
Un vrai foutoir quoi !!! En fois l'ensemble digéré, je m'y pencherai (c'est fou ce qu'on arrive à trouver comme occupations).
Ph.

domi
Administrateur
Messages : 3230
Enregistré le : mer. 17 sept. 2014 18:12
Localisation : Seine et Marne

Re: PHP - Page figée

Message par domi » mer. 15 avr. 2015 20:12

phdenaujan a écrit :Penses-tu qu'il soit possible de lancer une page PHP en fond de tache lors de l'ouverture d'une autre page ?
Nativement, non.
Mais en utilisant Ajax, oui

Le principe de PHP est un langage exécuté par le serveur, et cela se passe de la sorte :
  • Le navigateur appelle une page Php via l'Url. Puis attend le retour (tu sais, la roue qui tourne dans la barre de titre du navigateur ;-)).
  • Le serveur exécute le code Php de la page, d'un bout à l'autre. Quand il a terminé, il génère du code HTML qu'il envoi au navigateur.
  • Le navigateur reçoit le code HTML, il interprète le code et affiche la page.
A partir du moment où le code est retourné au navigateur, le navigateur n'attend plus rien. Donc même si de part je ne sais qu'elle solution tu arrivais à faire tourner du code Php en tache de fond (donc sur le serveur), il serait impossible d'envoyer le résultat au navigateur, qui lui n'attend plus rien, et donc n'affichera rien.

Pour cela, il est maintenant possible de passer par Ajax.
Le principe est le même que ci-dessus, sauf qu'il y a un code Javascript, qui lui est interprété par le navigateur, et pas par le serveur.
Ce code javascript peut travailler en tache de fond du navigateur, et donc appeler une page Php, qui sera interprété et renvoyé à javascript.
Dans ce cas, on voit des choses se passer à l'écran, sans que la page se recharge, car c'est uniquement le code javascript qui interfère avec le navigateur, et pas la page complète.

Je regarde tout à l'heure si j'ai un moment pour te faire un exemple.
Passionné de Raspberry, Arduino, ESP8266, ESP32, et objets connectés :
Spécial débutant, concevez vous-même votre domotique DIY : https://www.youtube.com/c/DomoticDIY
Conception d'une station météo DIY, et envoi des infos à votre Domotique.

guillaume9344
Raspinaute
Messages : 629
Enregistré le : mar. 6 janv. 2015 19:44
Localisation : finistere

Re: PHP - Page figée

Message par guillaume9344 » jeu. 3 déc. 2015 21:12

phdenaujan a écrit :

Code : Tout sélectionner

						{
							$rfsnif = shell_exec ('sudo /home/pi/433Utils/RPi_utils/./RFSniffer > /dev/null &');
						}
					
				
					?>
Cordialement,

Encore une fois merci framboise 314 , 5h que je bloquai sur une page qui mouline dans le vide en php et c'est en voulant poster une question ici que je trouve la solution!!!!!!!
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

phdenaujan
Messages : 63
Enregistré le : lun. 5 janv. 2015 21:29

Re: PHP - Page figée

Message par phdenaujan » ven. 4 déc. 2015 13:42

Je n'ai toujours pas pris le temps de me pencher sur Ajax... Ma page mouline donc toujours. Mais je ne désespère pas de mettre, un jour, un petit [RESOLU].
Ph.

Répondre

Retourner vers « Autres langages »