2010-07-07 11 views
5

Próbuję udostępnić na żywo przetwarzanie plików w CGI i pokazywać dane na ekranie podczas ich przesyłania.Apache2 i CGI - jak utrzymać Apache w buforowaniu danych POST?

Jednak wydaje się, że Apache2 czeka na zakończenie pełnej sesji POST przed wysłaniem aplikacji CGI w ogóle.

Jak zmusić Apache2 do zaprzestania buforowania POST do mojej aplikacji CGI?

EDIT

Wydaje się, że to faktycznie wyjście CGI, że to są buforowane. Rozpocząłem przesyłanie strumieniowe danych do pliku tymczasowego, aby zobaczyć, jak się rozwija. To i mam kolejny problem.

1) Dane wyjściowe są buforowane. Próbowałem SetEnvIf (i po prostu SetEnv) dla "! Nogzip", "nogzip" i "! Gzip" bez powodzenia (w definicji katalogu CGI).

2) Wydaje się, że Apache2 nie odczytuje danych wyjściowych CGI, dopóki proces CGI nie zostanie zakończony? Zauważyłem, że moja aplikacja CGI (spłukująca lub nie) jest zawieszona na stałe na linii "fwrite (..., stdout)" około 80K.

EDIT

Dobra, Firefox jest brudząc ze mną. Jeśli wyślę plik 150K, to nie ma blokady CGI w okolicach 80K. Jeśli plik ma rozmiar 2G, istnieje blokada. Tak więc Firefox nie czyta danych wyjściowych z serwera podczas próby wysłania pliku ... czy istnieje jakiś nagłówek lub alternatywny typ zawartości, aby zmienić to zachowanie?

EDIT

Dobra, Przypuszczam, że zablokowanie wyświetlania na dużych plikach CGI nie jest ważne, rzeczywiście. Nie muszę powtarzać pliku! Debuguję problem spowodowany przez narzędzia do debugowania. :)

Myślę, że to działa dobrze wtedy. Dzięki!

UWAGA KOŃCOWA

Podobnie jak notatki ... powód myślałem Apache2 został buforowane wejście było to, że zawsze mam „Content-Length” zmienną środowiskową. Domyślam się, że FireFox jest wystarczająco inteligentny, aby wstępnie obliczyć długość treści wielostronicowego przesłania formularza, a Apache2 przekazywał to dalej. Myślałem, że Apache2 buforował dane wejściowe i raportował długość.

Odpowiedz

3

Czy jesteś pewien, że to buforowany sygnał wejściowy to problem? Problemy z buforowaniem wyjściowym są znacznie częstsze i mogą nie być odróżnialne od buforowania wejściowego, jeśli metoda debugowania jest podobna do odpowiedzi.

(buforowanie wyjścia jest powszechnie powodowane przez unflushed stdout w skrypcie lub przez filtry. Zwykle winowajcą jest filtr DEFLATE, który jest często używany do kompresji wszystkie text/ odpowiedzi, czy pochodzą one ze statycznego pliku lub skryptu. Ogólnie dobrym pomysłem jest skompresowanie wyjścia skryptów, ale efekt uboczny, który spowoduje, że odpowiedź zostanie w pełni zbuforowana. Jeśli potrzebujesz natychmiastowej odpowiedzi, musisz ją wyłączyć dla tego jednego skryptu lub wszystkich skrypty, poprzez ograniczenie stosowania AddOutputFilterByType do poszczególnych <Directory> S, lub za pomocą mod_setenvif ustawić uwagę !nogzip.)

Podobnie f wejście ilter (w tym ponownie DEFLATE) może spowodować, że wejście CGI będzie buforowane, jeśli go używasz. Ale są one mniej powszechnie używane.

Edycja: na razie, po prostu skomentuj dowolny httpd conf, który masz włączony filtr deflate. Możesz go przywrócić selektywnie, gdy będziesz zadowolony, że twoje IO jest niebuforowane bez niego.

Zauważyłem, że moja aplikacja CGI (zaczerwienienie lub nie) zawiesza się na stałe na „fwrite (..., stdout)” linia na około 80k.

Taa ... jeśli nie przeczytałeś wszystkich swoich danych wejściowych, możesz zablokować próbę zapisywania wyników, jeśli piszesz za dużo. Możesz zablokować wywołanie wyjścia, czekając na odblokowanie buforów sieciowych, aby móc wysyłać nowe dane, ale nigdy nie będzie, ponieważ przeglądarka próbuje wysłać wszystkie swoje dane, zanim zacznie czytać dane wyjściowe.

Nad czym tu pracujesz? Generalnie nie ma sensu zapisywanie danych wyjściowych informacji o postępie w odpowiedzi na bezpośredni formularz POST, ponieważ przeglądarki zazwyczaj go nie wyświetlają. Jeśli chcesz przekazać informację o postępie przesyłania na zwykłym formularzu HTML, zwykle odbywa się to za pomocą hacków takich jak sprawdzanie połączenia AJAX, aby zobaczyć, jak działa przesyłanie (co oznacza, że ​​informacje o postępie muszą być udostępniane, np. W bazie danych) lub za pomocą składnika przesyłania Flash.

+0

Próbuję linii! Nogzip bez większego sukcesu. Mam również teraz wyjściowy problem wyjściowy, jak opisano powyżej. – darron

+0

Ponieważ był to problem wyjściowy, a informacja DEFLATE jest całkiem przydatna, zaznaczam to jako odpowiedź. – darron

+0

Tak, wyjście nie było konieczne. Włączyłem go do debugowania i trochę mnie to poturbowało. Plan cały czas dotyczył opinii AJAX. Właściwie spróbuję przeanalizować i wyświetlić plik w jego postaci ... powinien wyglądać całkiem fajnie. Drobne, ale zadbane. – darron

0

Z (stara wersja) z podręczników Apache HTTP Server:

każdym razem skrypt robi „flush” do danych wyjściowych, które pobiera dane przekazywane do klienta. Niektóre języki skryptowe , na przykład Perl, mają własne buforowanie wyjścia - to można wyłączyć, ustawiając $ | Zmienna specjalna na 1. Oczywiście ta zwiększa ogólną liczbę przesyłanych pakietów , co może spowodować powolność dla użytkownika końcowego .

Czy próbowałeś wypłukać STDOUT lub sprawdzić, czy język, którego używasz ma buforowanie, które można wyłączyć?

+0

Tak, piszę STDOUT w odstępach 8K ... bez widocznego efektu. – darron

0

oto przydatny przewodnik dla kontrolowania buforowanie przy użyciu Perl po stronie serwera:

http://perl.plover.com/FAQs/Buffering.html

wiele pomysłów i koncepcji zastosowania do innych językach też, takie jak wykorzystanie buforowane i wyjście niebuforowana system surowy wywołania do odczytu i zapisu danych względem bibliotek I/O, które same buforują.

Powiązane problemy