![]() ![]() |
Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 108 Pomógł: 0 Dołączył: 15.10.2006 Skąd: zewsząd :P Ostrzeżenie: (0%)
|
Witam. Zainteresowałem się programem TorrentVolve (klient bittorrent napisany w php). Zauważyłem że ściąga on pliki nawet jeśli sam skrypt nie jest uruchomiony w przeglądarce. Główne pliki mają po 250 kb (5000+ linii), więc nie mam możliwości przeanalizowania działania programu krok po kroku.
Moje pytanie brzmi: jak zbudować w php skrypt który działałby nawet przy wyłączonej przeglądarce? Niekoniecznie ma to być ściąganie plików, po prostu interesuje mnie możliwość wykonywania przez php operacji "w tle". |
|
|
|
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 226 Pomógł: 23 Dołączył: 2.10.2007 Skąd: Słupsk Ostrzeżenie: (0%)
|
uruchomić go w usłudze Cron Jobs ;D
|
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 108 Pomógł: 0 Dołączył: 15.10.2006 Skąd: zewsząd :P Ostrzeżenie: (0%)
|
Hm... chyba rozgryzłem sposób działania tego torrenta. On ma dołączoną aplikację w javie, to ona jest odpowiedzialna za ściąganie. Ale dzięki za odpowiedź.
Ale google wskazało mi jeszcze jeden sposób, omijający crona i aplety w javie. ignore_user_abort" title="Zobacz w manualu PHP" target="_manual EDIT:--------------------------------------------------------------------------- A jednak wracam do tematu. Zainteresowała mnie możliwość pracy wielowątkowej w php (odsyłam do http://www.alternateinterior.com/2007/05/m...es-in-php.html). Skrypt ten używa funkcji proc_open" title="Zobacz w manualu PHP" target="_manual do uruchamiania równolegle wielu skryptów php, tzw. procesów. Główny skrypt (wywołujący procesy) będzie działać tak długo jak najdłużej pracujący proces. Zastanawiam się nad przeróbką skryptu tak, aby nie czekał on na zakończenie działania procesów (po prostu kończył się, a procesy działałyby nadal). Co na takiej konstrukcji można zyskać? Na przykład niezależnie działające skrypty ściągające duże pliki: wystarczy poprzez ini_set zignorować timeout i dodać sleep(), aby nie przeciążyć interpretera. Przystąpiłem do pracy. Zauważyłem że funkcja proc_open() nie blokuje interpretera, tylko samo wysłanie danych końcowych do przeglądarki (trochę jaśniej: po wykonaniu funkcji plik jest dalej przetwarzany, lecz sam wynik działania skryptu nie zostanie wysłany dopóki nie zakończą się wywołane tą funkcją skrypty). Zatem używanie proc_open() jest kiepskim pomysłem. Próbowałem użyć:
lecz efekt taki sam - interpreter oczekuje na odpowiedź konsoli 10 sekund (w pliku p5.php jest linijka sleep(10); ). Podobnie ma się sytuacja przy użyciu exec(), passthru() i system(). Powiedzcie mi: 1) Jak wywołać z jednego pliku uruchomienie drugiego tak aby oba kończyły się niezależnie? Oczywiście nie ma mowy o JS ani AJAX (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ten post edytował Michu 27.03.2009, 19:55:27 |
|
|
|
Post
#4
|
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów |
Nie wiem, czy by nie pomogło odpalenie z wysłaniem polecenia w tło, tzn. polecenie &.
Jest jeszcze wielowątkowość napisana w cURL, gdzieś na stronach Zenda jest to opisane. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) |
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 1 233 Pomógł: 87 Dołączył: 6.03.2009 Ostrzeżenie: (40%)
|
Odpowiedz jest prosta, shell_exec(), exec(), czekaja az uruchamiany proces sie zakonczy, a proc_open tego nie robi, przynajmniej tak jest na windowsie.
|
|
|
|
Post
#6
|
|
|
Grupa: Zarejestrowani Postów: 108 Pomógł: 0 Dołączył: 15.10.2006 Skąd: zewsząd :P Ostrzeżenie: (0%)
|
Na windzie może i tak, ale jestem szczęśliwym użytkownikiem linuxa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
|
|
|
|
Post
#7
|
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów |
Na Linuxie też te polecenia działają.
|
|
|
|
Post
#8
|
|
|
Grupa: Zarejestrowani Postów: 74 Pomógł: 4 Dołączył: 7.03.2008 Ostrzeżenie: (0%)
|
jest jeszcze inny sposob aczkolwiek wymaga on swobodnego dostepu do serwera z dwoch powodow:
- czasami wystapi koniecznosc "ubicia" tego procesu i jego dzieci ktore zainicjowalismy z poziomu skryptu a ktore maja juz swoje "zycie" - nietypowa konfiguracja(?), serwer musi akceptowac zadania od samego siebie slowem sluchac na lokalnym interfejcie przyklad implementacji to system Pommo Mailing (http://pommo.org/Main_Page) gdzie uzyto respawning czyli wywolanie skryptu przez samego siebie co powoduje ze mozna zainicjowac skrypt i kontynuowac jego dzialanie bez koniecznosci crona czy interakcji uzytkownika skrypt "mnozy" sie sam wywolujac sam siebie lokalnie tuz przed Runtime do analizy polecam: plik: /inc/classes/mailctl.php linijka: 62 funkcja spawn() ktora wykorzystuje do tego fsockopen() |
|
|
|
Post
#9
|
|
|
Grupa: Zarejestrowani Postów: 42 Pomógł: 0 Dołączył: 19.06.2006 Ostrzeżenie: (0%)
|
ja też długo szukałem, aż w końcu poradziłem sobie w ten sposób:
jakis_skrypt.php
i teraz mamy w tym samym folderze wykonaj.php
exec wiadomo wykonuje skrypt php za poleceniem "php", >/dev/null powoduje, że wynik nie idzie nigdzie(idzie do nikąd?) i to o co się rozchodzi - encja na końcu powoduje, że skrypt wywołuje się w tle i nie zajmuje czasu wykonywania skryptowi wykonaj.php |
|
|
|
![]() ![]() |
|
Aktualny czas: 24.12.2025 - 05:29 |