Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Uruchamianie skryptu php "w tle"
Forum PHP.pl > Forum > PHP
siewca
Witam
Szukam metody na uruchomienie skryptu w tle.
Mam plik A, B oraz C
Chciałbym zrobić aby użytkownik po wypełnieniu formularza i zapisaniu go w bazie poprzez skrypt w pliku A został przekierowany do pliku B gdzie będzie podsumowanie, w tym czasie zostanie uruchomiony skrypt w pliku C. Ale tak żeby użytkownik nadal pozostał na stronie B.

Myślałem żeby wykorzystać Ajax i przesłać do pliku C jakiś parametr metodą GET lub POST
np. wysyłam przez GET: parametr=on
a w pliku C umieszczam:
  1. if($_GET['parametr']=='on') {
  2.  
  3. kod który ma się wykonać
  4.  
  5. }


co o tym myślicie? może jest jakieś inne rozwiązanie tego problemu?
Hekko
Jeśli w skrypcie nie ma tekstu który ma się wyświetlać to include ?
siewca
Nie było by problemu właśnie gdyby nie to że w pliku C jest skrypt który powoli się wykonuje, około 15 sekund, więc użytkownik w tym czasie nie mógłby przeglądać strony.
Kildyt
Chmm.. może curl (o ile jest możliwość zerwania połączenia, nie wiem)?
Wstawienie niewidocznej pływającej ramki byłoby uciążliwe dla odwiedzającego ze względu na status ładującej się strony.
Spróbuj także wysłać zapytanie do serwera (np. cron, ale coś innego na co skrypt nie będzie musiał czekać) (patrz: shell_exec, system) jeżeli na serwerze nie masz wyłączonych tych funkcji.
Najłatwiej będzie wstawić skrypt javascript do zwracanego kodu HTML, który wyśle zapytania AJAX-em o plik. W takiej sytuacji musisz jednak pamiętać o użytkownikach/botach, które nie wspierają js-a.
smentek
Ciekaw jestem co to za skrypt ktory wykonuje sie 15 sekund...

@siewca zwykle chcemy miec pewnosc ze calosc algorytmu jest wykonywana. Nalezy chyba przyjac zalozenie ze i w tym wypadku. Jezeli uzyjemy AJAX czy nawet jakiekolwiek inne wywolanie po stronie serwera tak jak sugerujsz to jaka mamy pewnosc ze C zostanie wykonane?

Nalezy opracowac bufor (tabela w bazie danych) na ktory trafiaja wywołania C (rekordy) ktore sa nastepnie zciagane przez wywolania CRON i wykonywane, jezeli wykonanie sie powiedzie to mozna zdjac rekord z bufora. Wrzucanie na bufor siedzi w A lub B, Zdejmowanie w C lub w czyms co uruchamia C i sprawdza ze C się powiodło.
siewca
No właśnie w pliku C jest też funkcja która zapisuje raport w bazie, czyli pomoże mi sprawdzić czy skrypt z pliku C został wykonany.
Pracuję nad wersją z wykorzystaniem parametru wysyłanego GET-em przez Ajax. Zobaczę jak będzie to śmigało smile.gif
Hekko
Ale jeśli użytkownik zamknie skrypt B to C się również nie skończy wykonywać i klops. Najlepiej oprzeć to o cronjobs.
zegarek84
Cytat(Hekko @ 23.01.2011, 12:34:28 ) *
Ale jeśli użytkownik zamknie skrypt B to C się również nie skończy wykonywać i klops. Najlepiej oprzeć to o cronjobs.
to, że ktoś zamyka stronę/połączenie nie musi być równoznaczne z tym, iż przerywa pracę naszego skryptu - to my o tym decydujemy...

a pro po tematu - przeanalizuj fragmencik kodu:
  1. echo 'cokolwiek lub nic';
  2.  
  3.  
  4. header('Content-Type: text/html; charset=utf-8');
  5. header('Connection: close');
  6. header('Content-Language: pl');
  7. header('Content-Length: '.ob_get_length());
  8. header('Pragma: public');
  9. header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
  10. header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
  11. header('Cache-Control: no-store, no-cache, must-revalidate'); // HTTP/1.1
  12. header('Cache-Control: pre-check=0, post-check=0, max-age=0'); // HTTP/1.1
  13. header ('Pragma: no-cache');
  14. header('Expires: 0');
  15.  
  16. // a tu poł±czenie już zamknięte jest i rób cokolwiek - tak więc ten plik możesz też z przegl±darki odpalić i i on sobie spokojnie swoje będzie robił - a ze skryptu powyższego fragment odpowiedzi mógłby¶ odebrać po czym sam zamkn±ć poł±czenie - bo odpowiedĽ dostaniesz od razu zanim skrypt skończy się wykonywać - niżej własciwa czę¶ć na któr± nie chcesz czekać....


i jeszcze może: PHP uruchomienie procedury składowanej bez czekania na resultat
smentek
Cytat(zegarek84 @ 23.01.2011, 12:56:27 ) *
to, że ktoś zamyka stronę/połączenie nie musi być równoznaczne z tym, iż przerywa pracę naszego skryptu - to my o tym decydujemy...

Jasne ale nie chodzi o to że uda nam sie uruchomić C, chodzi o to że nie bedziemy mieli pewnosci ze C sie powiodlo. Co bedzie jezeli pomiedzy wywolaniem procedury a zakonczeniem wykonania C pan Mietek wyciagnie wtyczke z serwera i wszystko zdechnie w polowie zadania (przypominam ze mowimy o 15 sekundach dla wykonania programu to jest cała epoka)? Co w takim wypadku ponownie wywola C?

W przypadku bufora z taskami zdejmowanymi przez CRON, mozna zamiescic w jednej tranaskcji zdejmowanie tasku i te operacje ktore robi C. Dzieki czemu mamy absolutna pewnosc ze C zostanie wykonane i ze nie zostanie wykonane parokrotnie.

Oczywisice pod warunkiem ze C nie jest wywolywaniem żądania do jakiejs zdalnej uslugi, ktora nie daje potwierdzenia ze zostala wykonana z powodzeniem, ale to juz inna bajka...
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.