Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: TorrentVolve - praca w tle
Forum PHP.pl > Forum > PHP
Michu
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".
jareeny
uruchomić go w usłudze Cron Jobs ;D
Michu
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ć:
  1. <?php
  2. echo shell_exec('php -q p5.php');
  3. ?>

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 smile.gif
erix
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. winksmiley.jpg
wNogachSpisz
Odpowiedz jest prosta, shell_exec(), exec(), czekaja az uruchamiany proces sie zakonczy, a proc_open tego nie robi, przynajmniej tak jest na windowsie.
Michu
Na windzie może i tak, ale jestem szczęśliwym użytkownikiem linuxa smile.gif
erix
Na Linuxie też te polecenia działają.
guitarnet.pl
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()
hevellius
ja też długo szukałem, aż w końcu poradziłem sobie w ten sposób:

jakis_skrypt.php
  1. <?php
  2. sleep(20);
  3. //cos dla testu z wyczekaniem i wyrzucajace jako wynik czas wykonania
  4. mkdir("/path/to/my/dir", 0700);
  5. echo date("H:i:s");
  6. ?>


i teraz mamy w tym samym folderze

wykonaj.php

  1. <?php
  2. exec('php jakis_skrypt.php >/dev/null &');
  3. echo "plik zostal utworzony";
  4. ?>


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
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.