Thread CGI: sofortige Ausgabe im Browser erzwingen (8 answers)
Opened by hop at 2012-10-16 13:01

topeg
 2012-10-16 13:54
#162655 #162655
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Das Problem ist nicht das Script sondern der Browser. Wann ein Browser anfängt zu Renden hängt von vielen Faktoren ab. Unter anderem die schon übertragene Datenmenge und die Wartezeit. Aber auch Faktoren wie die Komplexität der Seite, wann und wo CSS benutzt wird, welche Bilder wo eingebunden werden, wie hoch die Übertragungsrate ist, etc. beeinflusst das Verhalten. Und nicht zu vergessen, das sich jeder Browser und jede Browser Generation anders verhält.
Du kannst das ein wenig beeinflussen, wenn du weißt wie lang die Seite werden wird. Mitdem Headerwert Content-length: <number> kannst du sagen wie viele Bytes übertragen werden sollen. Wenn der Browser merkt, das fast alles übertragen ist, fängt er schon an zu Rendern. Das ist aber keine Garantie für irgendwas.

Willst du das zuverlässig machen musst du auf Javascript oder Iframes zrückgreifen und den Serverprozess so gestalten dass mehrere Requests gemacht werden. Das steigert natürlich die Komplexität der Programmierung enorm.

Das Beste ist du versuchst die Laufzeit des Scripts möglichst kurz zu halten.

EDIT:
Gerade ausprobiert. Beim Firefox fängt er an zu Rendern wenn 1000byte Übertragen wurden

Hier der Test:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/perl
use strict;
use warnings;

my $text1 = << 'EOHTML';
<html>
  <head>
    <title>TEST WAIT</title>
  </head>
  <body>
    <p>
EOHTML
$text1 .= "TEXT_A_$_ \n" for(0..90);
$text1 .= "    </p>";
$text1 .= "    <b>??????</b><hr>\n";


my $text2 = "    <p>\n";
$text2 .= "TEXT_B_$_ \n" for(0..10);
$text2 .= << 'EOHTML';
    </p>
    <b>??????</b><hr>
  </body>
</html>
EOHTML

$|=1;

$text1=~s/\Q??????/sprintf('%06u',length($text1))/e;
$text2=~s/\Q??????/sprintf('%06u',length($text2))/e;

#print "Content-length: ".(length($text1)+length($text2))."\x0D\x0A";
print "Content-type: text/html\x0D\x0A";
print "\x0D\x0A";

print $text1;
sleep(5);
print $text2;

Last edited: 2012-10-16 14:04:29 +0200 (CEST)

View full thread CGI: sofortige Ausgabe im Browser erzwingen