logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Skrypt java pokazujący status wykonania pętli PHP

27 Kwi 2019 11:20 681 9
REKLAMA
  • #1 17929097
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #2 17929532
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 224
    Niemożliwe. PHP jest wykonywane po stronie serwera, JS po stronie klienta. Serwer nie zwróci danych z PHP do momentu, gdy nie zostanie wykonany cały skrypt PHP.
  • #3 17929609
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1461
    Nie ma skryptów java, jest język (kompilowany) Java i jest JavaScript do skryptów
  • REKLAMA
  • #4 17930237
    ble___
    Poziom 17  
    Posty: 149
    Pomógł: 22
    Ocena: 19
    Pewnie by się dało zrobić inny plik php który będzie uzyskiwał stan postępu ( z tym mogą być problemy ).
    Wtedy można by napisać w js skrypt który co jakiś czas (lub na zasadzie HTTP long polling'u) wywołuje ten drugi php i wyświetla postęp.

    Trudność w napisaniu drugiego skryptu polega na przekazaniu informacji z pierwszego php do drugiego php.
    To by się chyba dało zrobić np. za pomocą jakiegoś IPC (inter-process communication) np. https://php.net/manual/en/book.sem.php msg_send
    (ale to często niezainstalowane albo z innego powodu niesprawne). Moża by do komunikacji użyć plików ale to z wielu powodów niezalecane.

    Trzeba by też jakoś identyfikować dany postęp (jak 2 klientów jednocześnie się połączy to będą 2 postępy jednocześnie).

    Albo może cały skrypt wywołać jak long polling tak żeby wysyłał na bieżąco postęp (nie jestem pewny czy możliwe do obsłużenia w js).

    Albo wpisać w wyszukiwarkę "php progress library" i spróbować któregoś z dostępnych gotwców np. http://w3shaman.com/article/php-ajax-progress-bar.
  • #5 17930295
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #6 17930803
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 224
    Albo taki plik byś musiał udostępniać przez Apacha, albo przez inny plik PHP. Z poziomu JavaScript(!) asynchronicznie po prostu wysyłasz zapytanie (hasło: AJAX). Ale po pierwsze - co, jeśli równocześnie więcej niż jeden klient wywoła - trzeba uwzględnić. A druga rzecz to równoczesny dostęp do zapisu i odczytu - potrafi to szwankować. Po trzecie: jeśli przebieg pętli będzie krótki, postęp będzie mało wiarygodny (dla mnie to w ogóle nie można tego nazwać pokazywaniem statusu wykonania pętli). Jeśli zaś długi, to trzeba mieć na uwadze limity czasu wykonania, a dodatkowe zapisywanie do pliku, który na dodatek będzie współdzielony jeszcze dodatkowo wydłuży.

    Generalnie protokół HTTP średnio nadaje się do monitorowania wykonania programu po stronie serwera w czasie rzeczywistym.
  • REKLAMA
  • #7 17931023
    Konto nie istnieje
    Poziom 1  
  • #8 17934365
    Arkasian
    Poziom 10  
    Posty: 30
    Pomógł: 3
    Ocena: 2
    W zależności od tego czy Twoja struktura to SSR czy CSR update progress baru możesz wykonać na różne sposoby.
    Mogą to być przeładowania strony wymuszane co sekundę przez klienta,(słabe, ale proste bo fullSSR)
    Mogą to być elementy dynamiczne na stronie klienta: Vanilla JS i jedziesz AJAXem.
    W przypadki AJAX musisz pomyśleć o async/await wtedy też inaczej wykonasz endpoint API aby był kompatybilny; inną opcją jest wykonanie long pollingu na endpoincie, ale to będzie duży load na serwerze przy wielu klientach.
    Ogólnie to to co chcesz zrobić już na samym podłożu źle ująłeś, konceptualnie tj. nie sprawdzas postępu pętli; sprawdzasz postęp pracy wykonaną przez skrypt na backend web appki zatem nazwij to tak. Stwórz sobie, wymodeluj coś takiego jak AbstractJob, dziedzicz od tego i stwórz ConcretAJob a w tym konkretną robotę i to dopiero wywołuj z poziomu publicznego API - czy to by był SSR czy CSR(tj. Web API czy RESTful).

    Dodano po 58 [minuty]:

    Dżyszla napisał:


    Generalnie protokół HTTP średnio nadaje się do monitorowania wykonania programu po stronie serwera w czasie rzeczywistym.


    No, a tu błąd. Bo to zależy od zastosowania: streamowanie takie jak on chce wykonać, a nawet większych usług chodzi po HTTP i ma się jakkolwiek dobrze (streaming video na przykład); nie jest to oczywiście najlepsze są lepsze, ale z jakiegoś powodu inny mocny protokół do komunikacji i streamowania gRPC jest zbudowany nad HTTP, więc nad tą uwagą to zastanowiłbym się. Zresztą zwracanie uwagi na to, że HTTP się nie nadaje(przy tym nie rozważenie tak na prawdę wszystkich przypadów użycia) bez podania alternatywy rzekomo jakkolwiek lepszej, jest całkowicie bez sensu.
  • #9 17934448
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1461
    Arkasian napisał:
    W zależności od tego czy Twoja struktura to SSR czy CSR update progress baru możesz wykonać na różne sposoby.
    ...


    Kolega pyta o PHP i jest początkujący.
    async await też tam nie ma
    Trochę się rozpędziłeś
  • #10 17934457
    Arkasian
    Poziom 10  
    Posty: 30
    Pomógł: 3
    Ocena: 2
    JacekCz napisał:
    Arkasian napisał:
    W zależności od tego czy Twoja struktura to SSR czy CSR update progress baru możesz wykonać na różne sposoby.
    ...


    Kolega pyta o PHP i jest początkujący.
    async await też tam nie ma
    Trochę się rozpędziłeś


    Podałem wszystkie możliwe opcje, które przyszły mi oczywiście na myśli. Zauważ, że zacząłem od tej najprostszej, przecież ewentualnie nikt nie broni mu wpisać w Google tego lub zapytać mnie o to tutaj, o więcej szczegółów; wykorzystanie lepszej opcji tutaj daje mu ewentualną korzyść z zapewnienia cokolwiek większej skalowalności i reprodukowalności kodu czy też nawet samego rozwiązania.

Podsumowanie tematu

✨ Użytkownik poszukuje skryptu PHP, który po uruchomieniu pętli for z określoną liczbą iteracji ($x = 300) dynamicznie wyświetlałby postęp wykonania, zwiększając zmienną $y o 1 w każdej iteracji. Odpowiedzi wskazują na ograniczenia PHP jako języka po stronie serwera, który nie może na bieżąco komunikować się z klientem. Proponowane rozwiązania obejmują użycie AJAX do asynchronicznego pobierania postępu z drugiego skryptu PHP, który mógłby zapisywać stan w pliku tekstowym. Wskazano również na problemy związane z równoczesnym dostępem do plików oraz na konieczność rozważenia wydajności i limitów czasu wykonania. Użytkownik wykonuje skrypt lokalnie na WampServerze, co może ułatwić implementację.
Wygenerowane przez model językowy.
REKLAMA