Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Zatrzymanie pętli przyciskiem?
Forum PHP.pl > Forum > Przedszkole
mix091
Dzieńdobry smile.gif

Mam na swojej stronie dwa guziki: uruchom i zatrzymaj. Chciałem zrobić tak, aby po wciśnięciu guzika uruchom zaczęła wykonywać się pętla while, której warunkiem zatrzymania miało by być wciśnięcie klawisza zatrzymaj. Chciałem to zrobić na takiej zasadzie, że po wcisnieciu buttona zatrzymaj ustawi się w nim zmienna logiczna $stop na true i pętla while sie zatrzyma jeżeli $stop jest inne niż false. Oto kod którym próbowałem to zrobić

  1. if (isset($_POST['zatrzymaj']))
  2. {
  3. $stop = true;
  4. }
  5. if (isset($_POST['uruchom']))
  6. {
  7. $dtemp = $_POST['docelowaTemp'];
  8. while ($stop == false)
  9. {
  10. // Kod petli
  11. }
  12. }


Ale mi to nie działa i coś mi się wydaje, że takie coś nie ma prawa działać. Jak wykonać takie zatrzymanie pętli?
Pomocy sad.gif
SzpaaQ
chyba nie w php
możesz ew w js napisać funkcje która będzie odświeżać plik .php i zatrzymać ją przyciskiem
mix091
Ale tu też pojawia się pytanie, jak zatrzymać funkcję js przyciskiem?
Terrorizer
Raczej w taki sam sposób, tylko zamiast isset $_post robisz sobie onClick do przycisku
Tomplus
Powiedz mi jak chcesz zatrzymać pętle w PHP która trwa zwykle szybciej niż kliknięcie przycisku? Nawet jakby się dało. Kliknięcie musiałoby powodować na serwerze polecenie kill process, a do tego PHP nie ma dostępu. Wykonanie polecenia dzieje się po stronie serwera.

Nawet przez JS nie zrobi się czegoś takiego. Chyba ze JS będzie przetwarzał i wyniki krokowo, będzie wysyłał do skryptu PHP (która nie ma już takiej pętli.)

mix091
Ale jeżeli dało by radę zrobić coś takiego, że js uruchamiał by mi mój skrypt w php to wtedy można by było zastąpić tą pętle while instrukcją if else. Tylko jak zrobić żeby js uruchamiał mi mój skrypt z pliku set.php? Przecież javascript działa po stronie użytkownika a skrypt php wykonuje się po stronie serwera?
Dejmien_85
Jedyne rozwiązanie to websockety, tj. nawiązanie stałego połączenia - wtedy przeglądarka utrzymuje stałe połączenie i na bieżąco może przekazywać różne dane od klienta (w tym wypadku od przeglądarki). Wtedy musiałbyś ustawić jakąś domyślną warrtość dla warunku w pętli, a nastepnie sprawdzać, czy nowa wartość (która nadpisze domyślną) nie została dosłana.

W tej chwili operujesz na błędnym założeniu, że PHP odpala tylko jeden proces, który działa. Wydaje się Tobie, że gdy raz go odpalisz wyślesz później drugi request, to że wrócisz do wcześniej dopalonego skryptu (proesu). Tak nie jest, przy każdym requeście odpalasz nowy proces, przy każdym Twoim requeście otwiera się nowy program (proces)
Terrorizer
Wszystko zależy od tego co ma robić ta pętla jeszcze....
mix091
Cytat(Terrorizer @ 6.12.2015, 12:49:55 ) *
Wszystko zależy od tego co ma robić ta pętla jeszcze....


Pętla jest bardzo banalna. Generalnie robię mały projekt do szkoły oparty na raspberry pi. Mój program ma wyświetlać na stronie www aktualną temperaturę w pomieszczeniu z czujnika i jeżeli wprowadzimy, że mamy dogrzać pomieszczenie np do 27*C to program ma wysłać 1 do przekaźnika, który uruchomi grzałkę i dogrzeje do tych 27*C i wyłączy. Jeżeli temperatura spadnie znowu poniżej tych 27*C(+-) to znowu ją włączy dogrzeje i się wyłączy i tak w kółko. Wygląda to aktualnie tak:


Do tego właśnie była mi potrzebna ta pętla i chciałem to zrobić właśnie tak:
  1. if (isset($_POST['zatrzymaj']))
  2. {
  3. $stop = true;
  4. }
  5. if (isset($_POST['uruchom']))
  6. {
  7. $dtemp = $_POST['docelowaTemp']; // zapisanie do zmiennej $dtemp docelowej temperatury w pomieszczeniu
  8. while ($stop == false)
  9. {
  10. while ($temp < $docelowatemp) // zapętla dopóki temperatura z czujnika < od docelowej temp.
  11. {
  12. include 'temp.php'; // Pobranie temperatury z czujnika
  13. exec("gpio write 2 1"); // Włącza grzałkę
  14. }
  15. exec("gpio write 2 0"); // wyłącza grzałkę
  16. }
  17. }

Ktoś wyżej pisał, że można by zrobić skrypt w js, który by uruchamiał nasz skrypt php co np. sekunde. Jeżeli można by tak zrobić to wtedy tą pętle można by zastąpić instrukcją if else, czymś takim np.
  1. <?php
  2. include 'temp.php';
  3. if ($temp < $a)
  4. {
  5. exec("gpio write 2 1");
  6. }
  7. else
  8. {
  9. exec("gpio write 2 0");
  10. }
  11. ?>


I wtedy ten skrypt był by uruchamiany co sekunde przez js i on by robił za pętle. Tylko nie wiem w ogóle czy tak też można zrobić, czy nie bardzo. Macie jakiś pomysł jak takie coś wykonać?
Terrorizer
Łooo, ja w takim razie nie czuję się dosyć kompetentny, aby doradzać w takim temacie biggrin.gif
SzpaaQ
możesz to zrobić w samym js i jeśli temperatura jest za duża wyłączy grzałkę a jeśli za mała włączy (wyśle dane do pliku.php )
  1. <button onClick="czas = setInterval(temp, 1000)">Start</button>
  2. <p id="temperatura">Kliknij Start Zeby zacząć</p>
  3. <button onClick="clearInterval(czas)">Stop</button>
Daimos
Zrób sobie oddzielne akcje (mogą być oddzielne pliki php):
grzalka-wlacz.php
grzalka-temp.php

Całą pętlę, aplikację, robisz w javascript, pliki PHP służą tylko do tego, aby włączyć/wyłączyć/spr temp. grzałki.
Czy pętla to Twoja decyzja, ale w javascript wystarczy wtedy setInterval i np. co 30sek, sprawdzanie temperatury.
Jeśli jest potrzeba sprawdzenia temperatury, ajaxem pobierasz wartość grzalka-temp.php i jak trzeba ją włączyć to wywołujesz grzalka-wlacz.php
Pyton_000
Zapewne to jest banalne (ale nie sprawdzone)

W pętli sprawdzasz czy

  1. if(isset($_SESSION['kill'])) {
  2. unset($_SESSION['kill']);
  3. die();
  4. }


Robisz sobie w HTML przycisk z Ajax który wysyła sygnał do jakiegoś innego pliku który ustawi Ci zmienną sesyjną.
W pętli powinieneś mieć wtedy przerwanie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.