Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php]POMOCY zapętliłem skrypt na serwerze !
Trojan
post
Post #1





Grupa: Zarejestrowani
Postów: 53
Pomógł: 10
Dołączył: 17.01.2008

Ostrzeżenie: (0%)
-----


  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 (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) (IMG:http://forum.php.pl/style_emoticons/default/blinksmiley.gif)

Ten post edytował Trojan 18.01.2008, 00:10:13
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
qrees
post
Post #2





Grupa: Zarejestrowani
Postów: 275
Pomógł: 44
Dołączył: 23.11.2007

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) (IMG:http://forum.php.pl/style_emoticons/default/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?
Go to the top of the page
+Quote Post
kopczyk
post
Post #3





Grupa: Zarejestrowani
Postów: 24
Pomógł: 2
Dołączył: 5.01.2008
Skąd: Jelenia Góra

Ostrzeżenie: (0%)
-----


Bądź cierpliwy... sam się zatrzyma (IMG:http://forum.php.pl/style_emoticons/default/thumbsupsmileyanim.gif)
Go to the top of the page
+Quote Post
devnul
post
Post #4





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Trojan
post
Post #5





Grupa: Zarejestrowani
Postów: 53
Pomógł: 10
Dołączył: 17.01.2008

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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); (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
qrees
post
Post #6





Grupa: Zarejestrowani
Postów: 275
Pomógł: 44
Dołączył: 23.11.2007

Ostrzeżenie: (0%)
-----


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); (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) (IMG:http://forum.php.pl/style_emoticons/default/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ę.
Go to the top of the page
+Quote Post
Cezar708
post
Post #7





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Trojan
post
Post #8





Grupa: Zarejestrowani
Postów: 53
Pomógł: 10
Dołączył: 17.01.2008

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
Gallareton
post
Post #9





Grupa: Zarejestrowani
Postów: 143
Pomógł: 0
Dołączył: 11.03.2007
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) )
2. Zawsze na wszelki wypadek ustaw jakis warunek pod ktorym robi break
Go to the top of the page
+Quote Post
devnul
post
Post #10





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
webdice
post
Post #11


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




  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.

Ten post edytował webdicepl 18.01.2008, 23:36:23
Go to the top of the page
+Quote Post
devnul
post
Post #12





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Trojan
post
Post #13





Grupa: Zarejestrowani
Postów: 53
Pomógł: 10
Dołączył: 17.01.2008

Ostrzeżenie: (0%)
-----


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ć (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) (to tylko przykład)
Go to the top of the page
+Quote Post
qrees
post
Post #14





Grupa: Zarejestrowani
Postów: 275
Pomógł: 44
Dołączył: 23.11.2007

Ostrzeżenie: (0%)
-----


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ć (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) (to tylko przykład)



A w któym momencie przypisujesz na zmienną $zmienna wartość 'stop' (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) Ten skrypt się nie zatrzyma...
Go to the top of the page
+Quote Post
devnul
post
Post #15





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.08.2025 - 02:26