Возможно ли, чтобы perl cgi script сегментировал свои ответы AJAX во множество отдельных HTTP-ответов?
Скажем, у меня есть этот код:
xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
onDataReceived(xmlhttp.responseText);
}
else if(xmlhttp.status!=200 && xmlhttp.status!=0) { }
}
xmlhttp.open("POST","script.cgi",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send(toURLString(options));
как javascript (не рассказывайте мне о проблемах совместимости объектов xml, то есть, я знаю, и мне все равно).
и это:
print "Content-type: text/html\n\n";
my %form = Vars();
if($ENV{REQUEST_METHOD} eq "POST" )
{
$|=1;
for(my $i, (1..100000000))
{
print "1\n";
}
}
как perl cgi. Можно ли распечатать этот результат в нескольких отдельных пакетах из 1s вместо генерации 100000000 1 с, прежде чем, наконец, получив выход?
Пожалуйста, ознакомьтесь с этим вопросом SO для возможных подходов, хотя это не относится к Perl:
Работа с инкрементным ответом сервера в AJAX (в JavaScript)
Из связанной статьи Wiki эта ссылка кажется наиболее актуальной: http://en.wikipedia.org/wiki/Comet_%28programming%29#XMLHttpRequest
Однако я бы настоятельно предложил рассмотреть подход опроса вместо "серверного push", который вы рассматриваете:
Сервер хранит фрагменты данных в виде доступных файлов (с некоторой метаинформацией заказа)
print "Location: xxxx";
# Sorry, forgot the exact form of Location HTTP response.
# Location points to URL mapped to /home/htdocs/webdocs/tmp/chunk_0.html
my %form = Vars();
if($ENV{REQUEST_METHOD} eq "POST" )
{
$|=1;
$file_num = 0;
my $fh;
for(my $i, (1..100000000))
{
if ($i % 1000 == 0) {
close $fh if $fh;
open $fh, ">", "/home/htdocs/webdocs/tmp/chunk_${file_num}.html";
# Add the usual error handling on open/close i'm too lazy to type
$file_num++;
}
print $fh "1\n";
}
print $fh "\n##############END_TRANSMISSION__LAST_FILE####################\n";
# This was a singularly dumb way of marking EOF but you get the drift
close $fh;
}
Опросчик AJAX извлекает их в цикле один за другим, обрабатывая ответ, содержащий следующий фрагмент, и ищет метаинформацию, чтобы узнать, что (и если) следующий фрагмент для опроса.