Dynamiczna zawartość strony (PHP i AJAX)

Cześć, mam irytujący problem z którym nie mogę sobie od dłuższego czasu poradzić, w skrócie:

Chcę żeby na stępujący kod:


echo 'first';

sleep(1);

echo 'second';

sleep(1);

echo 'third';

pojawiał się linia po linii.

Właściwie to znalazłam rozwiązanie korzystając z jQuery AJAX Http Stream (tutaj przykładowy kod: plugins.jquery.com/project/ajax-http-stream), ale nie potrafię sobie poradzić z implementacja tego w frameworku Yii. Wiem że jest metoda ajaxSubmitButton w CHtml, ale przeczytałam całą dokumentację, wszystkie przykłady jakie tylko znalazłam i dalej nie działa. Ostatnio spróbowałam najprostszego rozwiązania, mianowicie:


<button onclick="execute('/ESWebPanel/panel/test');">Click</button>

oraz


function execute(path)

{

    $.post(path, 

    function(data, status) /* On Request Complete */

    {

        alert(html(data));

    },

    function(packet, status, fulldata, xhr) /* If the third argument is a function it is used as the OnDataRecieved callback */

    {

        alert(html(data));

    });

}

ścieżka wydaje się poprawna, ale dalej nic się nie dzieje (JavaScript się wykonuje, ale nie PHP). Mam akcję test w tym pliku, próbowałam zresztą załadować dowolny plik php (podaję ścieżkę względną, np: /ESWebPanel/php_file/file_to_load.php), ale dalej nie działa. Będę wdzięczna za jakąkolwiek pomoc…

Co do ajax-http-stream:

Myślę, że warto popróbować z flush oraz z ob_flush, ale rezultat może być zmienny w zależności od rodzaju serwera, systemu na którym serwer pracuje oraz przeglądarki internetowej…

Wiem o tym, to był tylko przykładowy kod, na serwerze dałam:


function force_flush(){ ob_end_flush(); flush(); }

    

    error_reporting(0);

    for($i = 1; $i < 6; $i++)

    {

        echo $i . ', ';

        force_flush();

        sleep(1);

    }

    error_reporting(-1);

(wywalało warningi, dlatego dałam error_reporting()). Co do tego co napisałeś, to to nic nie da, jeśli nie ma callback’a OnDataRecieved i właśnie z dodaniem tego do Yii mam problem.

  • przykład ze strony którą podałam działa mi na Firefox’e 7.0.1 i Chromie 15.0.8…

No dobra… Na wstępie powiem, że w ogóle nie podoba mi się pomysł korzystania z plugina, który był wydany w jednej wersji, do starego JQuery, którego strona domowa nie działa, a autor sam przyznał, że nie rozwija wtyczki bo nie działa tak jak powinna z najnowszymi przeglądarkami. To, że działa teraz nie oznacza, że będzie działać w kolejnych wersjach przeglądarek. Nie wiem do końca co chcesz osiągnąć, ale na chwilę obecną przesyłanie danych z serwera do klienta jest najlepiej zaimplementowane w APE. Projekt specyfikacji HTML5 zawiera kanał komunikacji dwukierunkowej WebSocket oraz Server sent events. Ale to na razie projekt i różne przeglądarki inaczej to implementują. Więcej tutaj: http://dsheiko.com/w...ver-sent-events.

Ponieważ APE jest niezależnym serwerem (wymaga dostępu do konsoli na serwerze i trochę czasu na konfiguracje) najłatwiejszą emulacją technologii push jest odpytywanie serwera w określonych odstępach czasu. Na przykład co 10 sekund wysyłasz normalne zapytanie ajax i sprawdzasz czy stan obliczeń się zmienił itp.

To było słowem wstępu :). Odpowiadając na Twoje pytanie, myślę, że będzie ciężko wykorzystać funkcje z klasy CHtml bez jej mocnego rozbudowania. Najłatwiej będzie faktycznie napisać z palca odpowiedni kod tak jak w przykładzie z adresu który podałaś. Piszesz, że javascript się wykonuje. Co z samym zapytaniem? Narzędziach developerskich przeglądarki (lub firebug) widzisz zapytanie i odpowiedź? Osobiście stawiam na 2 rzeczy:

  1. Ścieżka względna… Spróbuj wpakować tam ścieżkę bezwzględną. Tu możesz wykorzystać createUrl().

  2. Czy kontroler do którego się podłączasz korzysta z jakiegoś mechanizmu autoryzacji? Spróbuj dać do danej akcji dostęp wszystkim.

Tak na prawdę najważniejsze jest to, czy wywołanie javascript w ogóle powoduje wysłanie jakiegokolwiek zapytania do serwera. Sprawdź to w pierwszej kolejności.

edit: Pamiętaj również, żeby ustawić w konfiguracji php dłuższy czas wykonywania skryptu. Na hostingach współdzielonych najczęściej te 30s dają, ale widziałem też perełki 5 sekundowe :).

Dzięki za wskazówki, masz rację co to tej wtyczki, zastosuję chyba metodę Long polling.