Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]POMOCY zapętliłem skrypt na serwerze !
Forum PHP.pl > Forum > Przedszkole
Trojan
  1. <?php
  2. $interval=1;
  3. $nazwa=0;
  4.  
  5. do{
  6. mkdir (&#092;"lol$nazwa\", 0700, TRUE);
  7. $nazwa++;
  8. sleep($interval);
  9. }while(true);
  10. ?>


dopaliłem taki skrypt na serverze www Jak to zatrzymac questionmark.gif blinksmiley.gif
qrees
Cytat(Trojan @ 18.01.2008, 00:07:44 ) *
  1. <?php
  2. $interval=1;
  3. $nazwa=0;
  4.  
  5. do{
  6. mkdir (&#092;"lol$nazwa\", 0700, TRUE);
  7. $nazwa++;
  8. sleep($interval);
  9. }while(true);
  10. ?>


dopaliłem taki skrypt na serverze www Jak to zatrzymac questionmark.gif blinksmiley.gif

Przykładowo zrestartować serwer, poczekać aż skrypt sam się zakończy (PHP przeważnie ma limit czasu wykonania), albo poczekać aż system się wywali.

Ciekawi mnie jeszcze, co przyszło ci do głowy, żeby napisać taki skrypt?
kopczyk
Bądź cierpliwy... sam się zatrzyma thumbsupsmileyanim.gif
devnul
Cytat
(PHP przeważnie ma limit czasu wykonania)

fakt ma ale jak widać limit został wyłączony (no chyba że ma wyłączone modyfikacje)

Cytat
Bądź cierpliwy... sam się zatrzyma

z pewnością - jak braknie miejsca na dysku


jak masz dostep do konsoli to albo reset serwera www albo kill procesu php
Trojan
Udało się ;] Skrypt zdążył stworzyć 5000 folderów zanim udało mi się to zatrzymać.

Umieściłem go na serwerze yoyo.pl (mam do niego dostęp tylko na ftp) więc nie mogłem zrestartować, wyłączyć procesu ani nic z tych rzeczy ;/

W skrypcie dałem na początku
set_time_limit" title="Zobacz w manualu PHP" target="_manual (10); niestety nie zadziałało (o dziwo ignore_user_abort" title="Zobacz w manualu PHP" target="_manual (TRUE); oraz set_time_limit" title="Zobacz w manualu PHP" target="_manual (0); działa)
zanim zorientowałem się ze skrypt pracuje dalej, było już ponad 500 folderów

-pierwsze co zrobiłem wywaliłem plik php którym wywołałem skrypt (nie pomogło)
-zmieniłem nazwę folderu w którym były tworzone następne foldery (nie pomogło)
-nawet stworzyłem folder o nazwie która miała się zaraz pojawić w nadziei że skrypt nie zdoła stworzyć go jeszcze raz. (zgadnijcie co)

Jedynym rozwiązaniem było usuniecie folderu w którym są tworzone następne. Wszedłem na FTP-a zaznaczyłem folder i dałem usuń… niestety więcej folderów powstawało niż było kasowanych. Trzeba było usunąć wszystkie foldery jednocześnie – tylko jak questionmark.gif Znalazłem w necie funkcje:

  1. <?php
  2. function rmdirr($dirname)
  3. {
  4. if (!file_exists($dirname)) {
  5. return false;
  6. }
  7.  
  8. if (is_file($dirname)) {
  9. return unlink($dirname);
  10. }
  11.  
  12. $dir = dir($dirname);
  13. while (false !== $entry = $dir->read()) {
  14. if ($entry == '.' || $entry == '..') {
  15. continue;
  16. }
  17. rmdirr("$dirname/$entry");
  18. }
  19.  
  20. $dir->close();
  21. return rmdir($dirname);
  22. }
  23. rmdirr("folder");
  24. ?>


Odpaliłem na serwerze i czekam... Strona przestała się wczytywać na FTPa też nie mogłem wejść - coś się działo. Po 5min folderów juz niebyło ;]

Pytanie jednak nadal pozostaje aktualne: W jaki sposób zatrzymać pętle jeżeli w skrypcie mamy:

ignore_user_abort(TRUE);
set_time_limit(0); questionmark.gifquestionmark.gif
qrees
Cytat(Trojan @ 18.01.2008, 11:23:15 ) *
Pytanie jednak nadal pozostaje aktualne: W jaki sposób zatrzymać pętle jeżeli w skrypcie mamy:

ignore_user_abort(TRUE);
set_time_limit(0); questionmark.gif questionmark.gif

Prosto: nie pisać tak durnych skryptów... To rozwiąże większość problemów. Jak tworzysz jakąś pętle, to zawsze dawaj w programie jakiś warunek któy zakończy tą pętlę.
Cezar708
Cytat(qrees @ 18.01.2008, 15:50:50 ) *
Prosto: nie pisać tak durnych skryptów... To rozwiąże większość problemów. Jak tworzysz jakąś pętle, to zawsze dawaj w programie jakiś warunek któy zakończy tą pętlę.


Oj nie gadaj. W etapie deweloperskim czasem zdarzają się takie wpadki. Każdy jest tylko człowiekim i każdy może jakiś błąd popełnić podczas pisania. Jedyne wyjście z takiej sytuacji to DOKŁADNIE przetestować wersję oprogramowania zanim wrzuci się ją na serwer produkcyjny.
Trojan
Następnym razem 2 razy się zastanowię zanim dam taki skrypt na serwer.

A wracając do sposobu zatrzymania, tylko restart serwera pomoże ? Dziwi mnie brak jakichkolwiek innych opcji...
Gallareton
1. Zawsze sprawdz skrypt u siebie na komputerze, gdzie PHP ma standardowo 30 sekund na wykonanie skryptu po czym ma timeout (sam sobie skrypta zapetlilem, bo wpisalem continue zamiast break tongue.gif)
2. Zawsze na wszelki wypadek ustaw jakis warunek pod ktorym robi break
devnul
Cytat
A wracając do sposobu zatrzymania, tylko restart serwera pomoże ? Dziwi mnie brak jakichkolwiek innych opcji...

nie ma magicznego sposobu w stylu opcji przerwij skrypt - php jest skryptem interpretowanym "linia po lini" od początku aż do końca lub napotkania błędu - nie ma mozliwoścu ustawienia np osobnego wątku/ który będzie czekał na sygnał zamknięcia. Ale jak już na siłę chcesz to można np w pętli dać warunek sprawdzania czy istnieje jakiś plik na dysku, który skrypt sam na początku utworzy - jesli plik raptem zniknie - to exit - taka łopatologiczna kontrola procesu winksmiley.jpg
webdice
  1. <?php
  2.  
  3. $do = true;
  4.  
  5. $interval=1;
  6. $nazwa=0;
  7.  
  8. do{
  9.  
  10. if ($_GET['exit'] == 'yes')
  11. {
  12. $do = false;
  13. }
  14.  
  15. mkdir ('lol' . $nazwa, 0700, TRUE);
  16. $nazwa++;
  17. sleep($interval);
  18. }while($do);
  19. ?>


EDIT: Dziwne, skrypt zatrzymywało, a katalogi tworzy dalej.
devnul
a co to da skoro parametr musisz przekazać przy wywołaniu? nie masz kontroli nad czasem trwania skryptu i możliwości przerwnia go w dowolnym momęcie.
Trojan
Index.php
  1. <?php
  2. $interval=1;
  3. $nazwa=0;
  4.  
  5. do{
  6.  
  7. include 'ustawienia.php';
  8.  if ($zmienna == 'stop')
  9. {
  10. break;
  11. }
  12.  
  13. mkdir ('lol' . $nazwa, 0700, TRUE);
  14. $nazwa++;
  15. sleep($interval);
  16. }while(true);
  17. ?>

ustawienia.php
  1. <?php
  2. $zmienna= '';
  3. ?>

Takie coś może być questionmark.gif (to tylko przykład)
qrees
Cytat(Trojan @ 19.01.2008, 16:45:30 ) *
Index.php
  1. <?php
  2. $interval=1;
  3. $nazwa=0;
  4.  
  5. do{
  6.  
  7. include 'ustawienia.php';
  8.  if ($zmienna == 'stop')
  9. {
  10. break;
  11. }
  12.  
  13. mkdir ('lol' . $nazwa, 0700, TRUE);
  14. $nazwa++;
  15. sleep($interval);
  16. }while(true);
  17. ?>

ustawienia.php
  1. <?php
  2. $zmienna= '';
  3. ?>

Takie coś może być questionmark.gif (to tylko przykład)



A w któym momencie przypisujesz na zmienną $zmienna wartość 'stop' questionmark.gif Ten skrypt się nie zatrzyma...
devnul
otóż zatrzyma jesli w trakciejego działania w pliku ustawienia.php zmienimy aktualną wartość na wartość stop ale jest to dość wolne rozwiązanie - ja nadal proponuje sprawdzać czy plik istnieje zamiast załączac i interpretować dodatkowy kod (jest to wolniejsze i w pewnym momęcie prawdopodobnie nastąpi coś w stylu przepełnienia z powodu braku pamięci).

a jak już się przy tym upierasz to zrób tak:
  1. <?php
  2. $interval=1;
  3. $nazwa=0;
  4.  
  5. do{
  6.  
  7. ;
  8.  if (require('ustawienia.php')===true)
  9. {
  10. break;
  11. }
  12.  
  13. mkdir ('lol' . $nazwa, 0700, TRUE);
  14. $nazwa++;
  15. sleep($interval);
  16. }while(true);
  17. ?>

i ustawienia.php (dla skryptu który ma działać)
  1. <?php
  2. return false;
  3. ?>

lub dla zatrzymania
  1. <?php
  2. return true;
  3. ?>
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.