Apache2 и CGI - как помешать Apache буферизовать данные POST?

Я пытаюсь обеспечить живой парсинг загрузки файла в CGI и показать данные по экрану, поскольку это загружается.

Однако Apache2, кажется, хочет ожидать полного POST для завершения прежде, чем послать заявление CGI что-либо вообще.

Как я могу вынудить Apache2 прекратить буферизовать POST к моему приложению CGI?

Править

Кажется, что это - на самом деле вывод CGI, это буферизуется. Я начал передавать данные потоком во временный файл для наблюдения, это - прогресс. Это, и у меня есть другая проблема.

1) Вывод буферизуется. Я попробовал SetEnvIf (и просто SetEnv) для"! nogzip", "nogzip", и"! gzip" без успеха (в рамках определения Каталога CGI).

2) Apache2, кажется, не читает вывод CGI до выходов процесса CGI? Я замечаю, что мое приложение CGI (сбрасывание или не) зависает постоянно на "fwrite (..., stdout)" строка приблизительно в 80K.

Править

Хорошо, Firefox смешивает со мной. Если я отправляю 150K файл, то нет никакого тупика CGI вокруг 80K. Если файлом является 2G, то существует тупик. Так, Firefox не читает вывод из сервера, в то время как он пытается отправить, файл... является там каким-либо заголовком или альтернативным типом контента для изменения того поведения?

Править

Хорошо, я предполагаю, что выходной тупик CGI на больших файлах не важен на самом деле. Я не должен повторять файл! Я отлаживаю проблему, вызванную путем отладки средств.:)

Я предполагаю, что это работает достаточно хорошо затем.Спасибо!

ЗАКЛЮЧИТЕЛЬНОЕ ПРИМЕЧАНИЕ

Так же, как примечание... причина я думал, что Apache2 буферизовал вход, был то, что я всегда получал переменную среды "Довольной Длины". Я предполагаю, что FireFox достаточно умен для предварительного вычисления длины содержания многослойной загрузки формы, и Apache2 передавал это. Я думал, что Apache2 буферизовал вход и сообщал о самой длине.

5
задан darron 7 July 2010 в 19:58
поделиться

2 ответа

Вы уверены, что проблема заключается в буферизации ввода? Проблемы с буферизацией вывода встречаются гораздо чаще и могут быть неотличимы от буферизации ввода, если ваш метод отладки похож на просто print в ответ.

(Буферизация вывода обычно вызывается либо невыбранным stdout в скрипте, либо фильтрами. Обычно виноват фильтр DEFLATE , который часто используется для сжатия всего text / ответов, независимо от того, исходят ли они из статического файла или сценария. В целом рекомендуется сжимать вывод сценариев, но побочным эффектом является то, что это приведет к полной буферизации ответа. Если вы требуется немедленный ответ, вам необходимо отключить его для этого одного или всех сценариев, ограничив применение AddOutputFilterByType определенными или используя ] mod_setenvif для установки примечания ! nogzip .)

Аналогичным образом, входной фильтр (включая, опять же, DEFLATE ) может вызвать буферизацию ввода CGI, если вы: повторно используя любой. Но они менее широко используются.

Edit: пока просто закомментируйте любой httpd conf, который у вас есть, включив фильтр deflate. Вы можете вернуть его выборочно, если будете довольны тем, что без него ваш ввод-вывод не буферизуется.

Я заметил, что мое приложение CGI (очищается или нет) постоянно зависает при "fwrite (..., stdout) "около 80 КБ.

Ага ... если вы не прочитали весь свой ввод, вы можете заблокироваться при попытке записать вывод, если вы напишете слишком много. Вы можете заблокировать вызов вывода, ожидая для очистки сетевых буферов, чтобы вы могли отправить новые данные, которые у вас есть, но они никогда не будут, потому что браузер пытается отправить все свои данные, прежде чем он начнет читать выходные данные.

Над чем вы здесь работаете ? В общем, нет смысла писать вывод информации о ходе выполнения в ответ на прямой запрос POST формы, потому что браузеры обычно не отображают его. Если вы хотите предоставить обратную связь о ходе загрузки при отправке простой HTML-формы, это обычно выполняется с помощью хаков, таких как проверка соединения AJAX, чтобы увидеть, как идет загрузка (это означает, что информация о ходе выполнения должна быть передана, например, в базе данных), или с использованием компонента загрузки Flash.

3
ответ дан 15 December 2019 в 06:13
поделиться

Из (старой версии) руководства по Apache HTTP Server:

Каждый раз, когда ваш скрипт делает "flush" для вывода данных, эти данные передаются клиенту. Некоторые языки сценариев языки, например, Perl, имеют собственную буферизацию для вывода данных - это можно отключить, установив $| специальную переменную в 1. Конечно, это увеличивает общее количество передаваемых пакетов, что может привести к ощущению медлительности для конечного пользователя.

Пробовали ли вы очистить STDOUT или проверить, есть ли в используемом вами языке буферизация, которую можно отключить?

.
0
ответ дан 15 December 2019 в 06:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: