Skocz do zawartości

Wykonywanie czasożernego skryptu w tle


tommek

Rekomendowane odpowiedzi

Mam w PHP skrypt pomocniczy, ktory odbiera olbrzymia porcje pewnych danych, przetwarza je i umieszcza w bazie danych. Cala operacja trwa okolo 1 minute. Odpalajac skrypt przez przegladarke strona laduje sie przez ponad minute i dopiero po wykonaniu calego skryptu pojawia sie wygenerowana tresc strony.

Czy jest jakis sposob, aby do przegladarki zaraz po odebraniu danych wyslac dowolny tekst i zakonczyc wczytywanie strony (z punktu widzenia przegladarki), ale zeby skrypt wykonywal sie dalej niejako "w tle"?

Odnośnik do komentarza
Udostępnij na innych stronach

Czy jest jakis sposob, aby do przegladarki zaraz po odebraniu danych wyslac dowolny tekst i zakonczyc wczytywanie strony (z punktu widzenia przegladarki), ale zeby skrypt wykonywal sie dalej niejako "w tle"?
Pierwsza część twojego zdania jest delikatnie mówiąc nonsensowna, ale jak chcesz załadować stronę, a w między czasie uruchomić jakiś skrypt w tle skorzystaj z techniki AJAX.

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Nie zrozumielismy sie...

Mam skrypt, ktory wykonuje sie ponad minute (pobiera pewne dane XML, parsuje je i umieszcza w bazie) i zalezy mi na tym, aby przegladarka (itp) nie czekala na zakonczenie wykonywania sie tego skryptu, lecz od razu zakonczyla polaczenie (wczytywanie sie strony), ale zeby skrypt dokonczyl sie wykonywac na serwerze tzn sparsowal tego XMLa i zaladowal dane do bazy.

Mowiac innymi slowami chce jakby zasymulowac wcisniecie przycisku "Zatrzymaj" w przegladarce podczas wykonywania sie skryptu, w ktorym jest zawarta instrukcja ignore_user_abort() (wtedy skrypt wykonuje sie do konca, nawet po wcisnieciu przycisku Zatrzymaj).

Pierwsza część twojego zdania jest delikatnie mówiąc nonsensowna, ale jak chcesz załadować stronę, a w między czasie uruchomić jakiś skrypt w tle skorzystaj z techniki AJAX.

Ajax nie wchodzi w gre (i nawet nic tu nie da - nie widze tu zastosowania JS), w dodatku skrypt ten wywolywany bedzie docelowo przez przegladarke tekstowa, ktora nie ma obslugi JS.

Odnośnik do komentarza
Udostępnij na innych stronach

Jest coś takiego jak CURL i połączenia asynchroniczne (google: curl asynchronous PHP -> https://nickyaitsky.com/index.php/2007/07/3...php-calls.html)

Łączysz się z stroną, ona wykonuje asynchroniczne zapytanie HTTP aby pobrać właściwy skrypt parsujący XML, czeka z 2-3 sekundy i po prostu kończy działanie (zapytania asynchroniczne nie blokują wykonywania skryptu).

ignore_user_abort() w obu plikach musi oczywiście być.

Odnośnik do komentarza
Udostępnij na innych stronach

No to pisz, że chodzi o przeglądarki tekstowe...

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Jest coś takiego jak CURL i połączenia asynchroniczne (google: curl asynchronous PHP -> https://nickyaitsky.com/index.php/2007/07/3...php-calls.html)

Łączysz się z stroną, ona wykonuje asynchroniczne zapytanie HTTP aby pobrać właściwy skrypt parsujący XML, czeka z 2-3 sekundy i po prostu kończy działanie (zapytania asynchroniczne nie blokują wykonywania skryptu).

ignore_user_abort() w obu plikach musi oczywiście być.

Wielkie dzieki, o cos takiego mi chodzilo, dziala pieknie :D

Pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

Można strone przesyłać porcjami. W przypadku poniżej pierwsza porcja to bedzie cały kompletny html.

<?php
ob_start("ob_gzhandler");
?>
<html>
..
</html>
<?php
ob_flush(); flush();
//tutaj ten skrypt
ob_end_flush();
?>

Albo można wywołać skrypt z iframe ktore bedzie nie widoczne dla usera. W tym przypadku skrypt bedzie uruchomiony z opóźnieniem, podczas nastepnego otwarcia strony.

W jednym i drugim przypadku bedzie widoczna cały czas animacja ładowania się strony po mimo że cała strona bedzie juz widoczna w przeglądarce.

.

Odnośnik do komentarza
Udostępnij na innych stronach

A jakiś system('php script.php&'); by nie wystarczył?:>

Tak tez probowalem, ale serwer zachowywal sie dziwnie, tzn zakanczal prace skryptu wywolanego funkcja system w tym samym momencie co konczyl sie wykonywac skrypt ktory te funkcje wywolal...

Zauważyłem że jak stosuję tego typu rozwiązania, trzeba wywoływać interpreter php poprzez podanie ścieżki bezwzględnej typu /usr/php oraz mieć dobrze ustawione ścieżki PATH w linuxie.

Aplikacje internetowe, systemy wspomagające SEO, programy pod Windows i Linux, info na https://shad.net.pl - dopisz się do Katalogu Firm

Odnośnik do komentarza
Udostępnij na innych stronach

Zauważyłem że jak stosuję tego typu rozwiązania, trzeba wywoływać interpreter php poprzez podanie ścieżki bezwzględnej typu /usr/php oraz mieć dobrze ustawione ścieżki PATH w linuxie.
Zgadza się, tak wlasnie wywoluje. Tylko wywolujac inny skrypt php w tle z poziomu PHP przez funkcje system, na serwerze powstaje nowy proces - "dziecko". I teraz jezeli proces "rodzica" sie zakonczy, wowczas serwer usuwa wszystkie procesy dzieci... Na innym serwerze nie mialem takiego problemu, tu jest, ale mniejsza z tym...

Ponizej zamieszczam kod skryptu, ktory ma wykonywac sie w tle (jakby ktos w przyszlosci potrzebowal) - wszystko w 1 pliku:

<?php
ignore_user_abort(true);
set_time_limit(0);

if ($_GET['background']==1)
{
// Tu mozna umiescic czesc skryptu,
// ktory wykona sie w tle, tzn przegladarka
// nie bedzie czekac na jego zakonczenie
}
else
{
// Tu mozna umiescic czesc skryptu, ktora nie
// powinna wykonywac sie w tle, a przegladarka
// powinna poczekac na jego zakonczenie

$ch = curl_init();
$sRequest = "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']."?background=1";
echo $sRequest;
curl_setopt($ch, CURLOPT_URL, $sRequest);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_exec($ch);
curl_close($ch);
}
?>

Jeszcze raz dzieki wszystkim za pomoc i pozdrawiam.

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności