Christian Kruse: wie erkennen, wenn Browserfenster geschlossen wird?

Beitrag lesen

Hallo André,

bei dem hahnebüchenden Unsinn, der hier verbrochen wurde, muss ich
doch mal antworten.

ich habe eine Problemstellung die es erfordert, das ein Perl-Script
erkennen soll ob der Anwender seinen Browser beendet hat.

Das ist nicht möglich. Du kannst höchstens erkennen, dass der
Webserver eines der beiden Dinge versucht: entweder, ein Filehandle
zu schließen oder, alternativ, ein Signal schickt, wobei Ersteres
meist mit Zweiterem einher geht. Die Gründe hierfür können absolut
unterschiedlich sein: Browserfenster geschlossen, Laden abgebrochen
(in dem Fall das gleiche), Verbindungs-Timeout, CGI-Timeout, etc, pp.

Genauer: der Anwender ruft das Script auf. Dieses soll nun an einem
bestimmten Punkt erkennen, ob der Anwender mittlerweile seinen
Browser beendet oder aber eine andere Internetseite aufgerufen hat.
Dabei soll ganz bewußt KEIN JavaScript (onUnload) zum Einsatz
kommen.

Das ist nicht möglich.

Geht sowas überhaupt?

Nein.
Was du tun kannst, ist folgendes: setze einen Signal-Handler für
SIGTERM, in dem du deine Aufräumaktionen machst. Weiterhin prüfe, ob
du etwas ausgeben kannst. Die Methode allerdings, die du machen
willst, ist nur dann sinnvoll, wenn du befürchtest, mitten in der
Ausgabe abgebrochen zu werden. Die von Struppi angepriesene Methode
ist *absoluter* Humbug, bitte setze sie nicht ein. Sie verschwendet
Systemresourcen (CPU-Auslastung in so einer print while 1;-Schleife
ist 100%) und verschwendet Bandbreite (das ist so ähnlich wie ein
ping -f, man schickt damit so viele Daten wie eben möglich an den
Client. Man nagelt ihn absolut zu damit). Als Provider würde ich dir
kündigen. Stattdessen mach das so:

my $do_run = 1;
while($do_run) {
  my $ebits;
  vec($ebits,fileno(STDOUT),1);

my ($nfound,$timeleft) = select(undef,undef,$ebits,.75);
  if($nfound == 1) {
    $do_run = 0;
  }
}

aufraeumen();

Ich hab das mal ganz naiv mit

print "text" || &meinesub();

probiert,

Wenn schon, dann bitte

print "text" or &meinesub();

Der Unterschied zwischen || und or ist die Präferenz.

print "text" || &meinesub();

ist das gleiche wie

print("text" || &meinesub());

während

print "text" or &meinesub();

das gleiche wie

print("text") or &meinesub();

ist.

in der Hoffnung das eine Sub aufgerufen wird, wenn der Print-Befehl
nicht ausgeführt werden kann.

Völlig korrekt, wenn du annimmst, dass du Probleme kriegen könntest,
wenn STDOUT während des Schreibens geschlossen wird. Wann das
passiert, habe ich ja oben beschrieben.

Vergiss aber in keinem Fall, den SIGTERM-Handler zu setzen! Sonst
wird das Script in einem solchen Fall stupide beendet.

btw. ... das Perl-Script läuft auf einem WinXP-Rechner mit MS IIS
auf dem ich Admin-Rechte habe ... falls dort etwas eingestellt
werden muß.

Inwiefern das unter Windows anders ist, kann ich dir nicht sagen. Ich
vermute aber, es wird dort ähnlich sein.

Grüße,
 CK

--
Das Leben ist wie ein Kartenspiel: was dir gegeben wurde, ist vorbestimmt. Doch wie du damit spielst, ist deine Entscheidung.