Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Coś na styl Comet przy pomocy AJAX
Forum PHP.pl > Forum > XML, AJAX > AJAX
Sephirus
Witam,

Ostatnio natrafiłem na kwestie stworzenia skryptu instalacyjnego w PHP do zainstalowania i skonfigurowania na serwerze jakiejś konkretnej aplikacji. Idea jest prosta skrypt całość wrzucamy na serwer, odpalamy powiedzmy "install.php" uzupełniamy ustawienia i klikamy "install". Od strony PHP jest to ogarnięte - robi wszystko co potrzeba. Sęk w tym, że zażyczono sobie do tego aby ten skrypt instalacyjny pokazywał postęp oraz statusy "jak idzie".

Poczytałem trochę to tu to tam i wpadłem na pomysł aby wykorzystać do tego AJAX'a. Widzę to tak - strona otwiera połączenie poprzez ajax'a ze skryptem odpowiedzialnym za instalacje. Skrypt ten działa nieustannie aż do zakończenia wszelkich działań. W tym czasie po zakończeniu jakiś konkretnych kroków przekazuje dane do przeglądarki i JS, które mogą być przerobione.

Odrobiłem lekcję u profesora Google ale nie znalazłem tego czego chciałem. Long polling tutaj to za mało, potrzebował bym wiedzy czy komuś udało się zrobić coś na styl techniki Comet pod AJAX'em... Czy jest to w ogóle możliwe? Czy komuś się to udało? smile.gif Wiem, że dostępna jest taka opcja jako aplet JAVY ale dowalanie APLETU JAVY do skryptu instalacyjnego przekreśla kompatybilność itd...
Crozin
Znacznie łatwiej będzie to zrobić przy pomocy ramki (IFRAME) oraz ob_flush. W manualu jak zawsze przykład.
Sephirus
To fakt - ale jest mały problem :/ Testowałem to rozwiązanie wcześniej i muszę przyznać, że udało mi się uruchomić jedynie pod chrome/safari reszta przeglądarek i tak tego nie rozumie i wyświetla wszystko po zakończeniu skryptu :/

Ale dzięki za sugestie wink.gif
zegarek84
można jeszcze inaczej zrobić delikatnie na odczepnego... skrypt instalacyjny zapisuje gdzieś logi na temat postępu instalacji w jakiejś bazie danych - a choćby nawet w pliku tekstowym jeśli nie ma możliwości skorzystania z bazy danych lub w sqlite... oprócz skryptu instalacyjnego masz jeszcze jakiś prościutki skrypcik czytający tylko postęp instalacji i zwracający tylko tą wartość kończący działanie...

po uruchomieniu instalacji, przez ajax odpytujesz skrypt sprawdzający status instalacji z "logów" do tego przygotowanych - uzyskujesz odpowiedź to ją wyświetlasz... jeśli instalacja nie zakończona i odpowiedź była baaardzo szybko (powiedzmy od zapytania do odpowiedzi minęła tylko 1ms) to sobie odczekujesz jeszcze te powiedzmy 99ms i kolejne zapytanie ajax (chyba nie ma sensu sprawdzać częściej niż co 100ms - a moim zdaniem nie ma sensu sprawdzać częściej niż co sekundę ;p) - jeśli internet był wolny i sama odpowiedź trwała 3s to odrazu pytasz się po raz kolejny...

gdy jedna z odpowiedzi będzie z logów, że instalacja zakończona to wyświetlasz 100% i już nie ma sensu wykonywać zapytania o stan instalacji - a nawet jeśli zapytasz to z logów odpowiedź dostaniesz że zakończona...
Sephirus
Muszę przyznać, że to niezłe obejście problemu wink.gif Wielkie dzięki w sumie myślałem o czymś podobnym w razie czego ale nie umiałem tego tak fajnie sprecyzować wink.gif

Pomogło wink.gif Zrobię to w ten sposób na razie ale i tak podrążę jeszcze ten temat tongue.gif

THX!
zegarek84
Cytat(Sephirus @ 29.06.2011, 23:09:56 ) *
Pomogło wink.gif Zrobię to w ten sposób na razie ale i tak podrążę jeszcze ten temat tongue.gif

Więc tak skrótowo flash z JavaScript może się komunikować więc może służyć za zdarzeniowego pośrednika w komunikacji - tu można by zastosować w pełni comet...

zakładamy, że nie ma flasha zainstalowanego i chodzi nam tylko o "komunikację zdarzeniową"...
od podstaw tej komunikacji na obejście zwykłym ajax'em...

oczywiście przy ajax'ie masz jeszcze narzut na nagłówki http i kosztowne każdorazowo nowe połączenie otwierane i zamykane

zrób sobie skrypcik ze sleep po 1s i pętlą np. 20 - do wymuszenia wysłania treści (wszystko zależy od konfiguracji serwera ale nieraz sam flash nie wystarczy) zastosuj zestaw funkcji
@ob_flush();
@flush();
@ob_end_flush();

lub ustaw ob_implicit_flush(true)
wiadomo, że będziesz widział linijka po linijce tak jakby na żywo obserwowany comet - ale ajax'a odpowiedź dostaniesz dopiero na końcu po zamknięciu połączenia

to co niemal każdy stosuje np. do czatów to odpytywanie serwera co sekundę - MASAKRA ISTOTNA (w przypadku tego tematu szkoda było wymyślać coś lepszego)


nieefektowne tego obejście, a w zasadzie efektowne ale jeszcze mocno lipne to przez AJAX pytasz się skrypta o jakieś zdarzenie - najlepiej najprościutszego skrypta tylko sprawdzającego tablicę zdarzeń w bazie danych i który jeśli nie ma nic do przekazania idzie spać na jakiś interwał czasu coby dla jednego urzyszkodnika nie zajechać serwera (na ileś tam milisekund) i w następnym przebiegu pętli sprawdza tablicę w bazie czy jest jakaś wiadomość dla szkodnika - jeśli jest zostaje zwrócony komunikat i skrypt kończy swoje działanie np. przez exit jednocześnie zamykając połączenie lub jeśli skrypt jeszcze coś miał zrobić możesz wysłać odpowiednie nagłówki z długością treści i by przeglądarka zamknęła połączenie a skrypt coś zrobi i kończy działanie (ale o tym nie potrzebnie wspomniałem że może jeszcze coś skrypt robić - to już lepiej niech inny moduł wykonuje a to niech będzie najprostszy skrypt) - gdy połączenie zostanie zamknięte skrypt js dostaje odpowiedź ajax i odpowiednio ta odpowiedź jest obrobiona - ponieważ czekamy na następne zdarzenie natychmiast odpytujemy po raz kolejny ten sam skrypt by było otwarte połączenie...
oczywiście obsłużyć trzeba też błędy komunikacji w js jak zbyt długi czas oczekiwania i inne powodujące zerwanie połączenia i trzeba nawiązać od nowa połączenie
W TYM ROZWIĄZANIU KAŻDY SZKODNIK PRZEZ AJAX ŁĄCZY SIĘ Z MINI DEMONKIEM a cała aplikacjia zapisuje komunikaty w tablicy - gdy komunikat jest pobrany przez demonka to demonek usuwa ten komunikat z tablicy komunikatów...
jeszcze poprawkę trzeba wziąć na limit otwartych połączeń z tą samą domeną - więc dobrze by było odpytywać subdomenę lub inną domenę...

JESZCZE TO NIE JEST IDEALNE GDYŻ NA SERWERZE POWSTANIE TYLE DEMONKÓW ILU JEST SZKODNIKÓW ;]

optymalizacja to zrobienie jednego demonka z rozwiązania powyżej - ale to już trzeba by napisać mini serwerek www w php obsługujący każde połączenie i żądanie nasłuchujący na jakimś porcie (lub na innej domenie) - niby są też takie małe projekciki nawet na serwerki całych stron www ale to tylko ciekawostka...

rozwiązanie które z Twojej strony wymagało by najmniejszego nakładu pracy to gotowiec APE (Ajax Push Engine) - z tego jeszcze nie korzystałem jakoś i bodajże jeśli jest zainstalowany flash to chyba z niego korzysta a jeśli nie to z komunikacji ajax... ale nowsza wersja podobno na innych stronkach nie potrzebuje proxy więc chyba samą technikę ajax zastąpili np. przez jsonp (gdzie skutek ten sam o omija się tak ograniczenia domenowe) [tak przy okazji jakbyś miał załączać zewnętrze skrypty js i dopiero po ich załadowaniu wykonywać jeszcze coś to temacik np. [JavaScript]Załączanie prototype poprzez js] - w APE jest też napisany jakiś serwerek ale to głównie bodajże biblioteka js...

i jeszcze może link do jakiegoś polskiego blogu:
APE: Comet serwer oraz kompletny framework javascript. Kompleksowe rozwiązanie Ajax Push.

może o niczym nie zapomniałem lub nic istotnego nie pominąłem ;]




Sephirus
I to mi wystarczy całkowicie smile.gif

Co prawda wynika z tego wszystkiego (co potwierdza też moje przemyślenia), że bez niczego z zewnątrz nie da się po prostu tego zrobić tongue.gif

Rozwiązanie APE które znalazłeś wymaga skompilowania APE pod serwerem co przekreśla zastosowanie takiego rozwiązania przy skrypcie instalacyjnym tongue.gif

Druga rzecz jaką opisałeś czyli tzw. long polling od jakiegoś czasu stosuje w aplikacjach pseudo-interaktywnych typu gry, czaty itp. Ale jego wadą jest ponawianie połączenia i kończenie pracy skryptu.

Mieszane rozwiązania jeszcze przemyślę a co do flash to muszę zajrzeć choć dorzucenie flasha do tego ogranicza kompatybilność ale może da się to jakoś ciekawie zrobić wink.gif

Dzięki za wszelkie info, napisałeś się ;P Doceniam i dziękuję - w zasadzie idea z twojego poprzedniego postu jest najprostsza, zapewnia kompatybilność wszędzie i zawsze i nadaje się do tego jednak najlepiej - Aby zrobić to inaczej jest trochę zachodu, który w przypadku tego konkretnego zastosowania jest mało opłacalny o czym się właśnie dowiedziałem wink.gif
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.