php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 30.11.2005, 03:24  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard Location-Header sofort an Client senden

Hallo.

Komische Geschichte:
PHP-Code:
<?php
header
('Location: anywhere');
// echo '.';
flush();
sleep(10);
?>
Dieses Skript sendet den Location-Header erst nach seinem kleinen Schläfchen an den Client.

Wenn ich jedoch nach dem header()-Befehl eine Ausgabe (echo 'irgendwas') mache, dann geschieht der Redirect direkt nach dem flush().

Kennt ihr einen Weg, wie ich die Header abgeschickt bekomme, ohne das Skript zu beenden oder eben so eine sinnlose Ausgabe vor flush() zu setzen?

Basti
Basti ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 30.11.2005, 03:34  
Erfahrener Benutzer
 
Registriert seit: 18.09.2003
Beiträge: 13.598
PHP-Kenntnisse:
Fortgeschritten
imported_Ben ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Eine Antwort, die dich zufriedenstellt habe ich nicht , aber ich habe eine Frage dazu.
Wenn du den header() absendest ... warum soll das Script dann weiterlaufen?
imported_Ben ist offline   Mit Zitat antworten
Alt 30.11.2005, 03:41  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Kennt ihr einen Weg, wie ich die Header abgeschickt bekomme, ohne das Skript zu beenden
macht definitiv keinen sinn und geht auch nicht ...

header werden mit php erst genau vor dem ersten 'body'-byte geschickt.
PHP-Code:
header('Location: bla');
exit; 
ist damit der kürzeste weg, den header sicher und sofort zu verschicken.

mit
PHP-Code:
header('Location: bla');
// some code ...
header('Location: blu');
exit; 
landet der client übrigens bei 'blu', gellens? ...

es macht also überhaupt keinen sinn, das skript nach einem Location-header _nicht_ zu beenden, es würde den code nur fehlerträchtig machen.
logging, debugging etc. sollte vorher stattfinden. der location-header ist damit genau die vorletzte aktion, die du machen solltest.

und zum flush() --- hast du die anmerkungen zum output-buffering angeschaut?
http://us2.php.net/manual/en/function.header.php


grüße
axo
axo ist offline   Mit Zitat antworten
Alt 30.11.2005, 03:50  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Zitat:
Zitat von Ben
Wenn du den header() absendest ... warum soll das Script
dann weiterlaufen?
Garbage Collection, Synchronisierung mit entfernten Server ... denk dir
was aus. Ich denke da an ein System, bei dem bei praktisch jedem
Request ein 302er gesendet wird und da könnte man sich den Part danach
mit Wartungsarbeiten vollpacken, anstatt dem Benutzer das Gefühl zu
geben, eine Seite sei noch nicht fertig geladen, obwohl ja schon alles
übertragen wurde (was passiert, wenn du nach einer "normalen" Ausgabe
noch weiterrechnest).

Zitat:
Zitat von axo
es macht also überhaupt keinen sinn, das skript nach
einem Location-header _nicht_ zu beenden, es würde den code nur
fehlerträchtig machen.
Dem kann ich nicht zustimmen. Natürlich kann man so unmöglich
programmieren, aber wenn das Teil fertig ist, lässt du ja ohnehin keine
Fehler auf die Bildschirme der Kunden und potentiellen Angeifer prasseln.
Also was soll das? Und was hat diese Einschränkung mit dem Sinn einer
slchen Vorgehensweise zu tun?

Zitat:
und zum flush() --- hast du die anmerkungen zum output-buffering angeschaut?
http://us2.php.net/manual/en/function.header.php
Welche Anmerkung meinst du?

Basti
Basti ist offline   Mit Zitat antworten
Alt 30.11.2005, 10:35  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Ich mache nach header("Location: ..") auch immer ein exit und hatte noch nie Probleme mit der Weiterleitung.
Zergling-new ist offline   Mit Zitat antworten
Alt 30.11.2005, 14:12  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Zitat:
Zitat von Zergling
Ich mache nach header("Location: ..") auch immer ein exit
und hatte noch nie Probleme mit der Weiterleitung.
Das ist ja auch nicht der Punkt. Meine Frage wäre, ob es einen Weg gibt, PHP
mitzuteilen, dass nun keine Header mehr folgen, außer eben durch eine
Beedigung des Skriptes oder das Senden von "body-Bytes".

Basti
Basti ist offline   Mit Zitat antworten
Alt 30.11.2005, 14:19  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard Re: Location-Header sofort an Client senden

Zitat:
Zitat von Basti
Kennt ihr einen Weg, wie ich die Header abgeschickt bekomme, ohne das Skript zu beenden oder eben so eine sinnlose Ausgabe vor flush() zu setzen?
Die Frage ist doch wozu? Du willst eine Weiterleitung aber das Skript nicht beenden, das ergibt irgendwie keinen Sinn. Wenn du noch ne Aktion vor der Weiterleitung ausführen willst, dann schreibs auch im Code vor die Weiterleitung?

Das weißt du ja denke ich mal auch, aber wüßt gern was du dann überhaupt vor hast
Zergling-new ist offline   Mit Zitat antworten
Alt 30.11.2005, 15:37  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Hi.

Okay, ich breite mich mal aus:

Ich will keine Aktion vor der Weiteleitung durchführen, sondern danach. In einem System,
an dem ich gerade dran bin, gibt es zwei Arten von Requests: Anfragen nach Seiten (page=home)
und Befehle, die übergeben werden (cmd=deluser&user=42 bzw. als ID, hinter der eine
Callback-Funktion steht).

Kommt eine action-Anfrage, so wird die Seite zusammengebaut, in die Session gepackt (unter
dem Titel der auszugebenden Seite und vielleicht mit Verfallsdatum) und eine Umleitung auf den
entsprechenden Page-Request geschickt. Kommt also ein Page-Request, so wird in der Session
geschaut, ob die Seite dort noch aktuell liegt und ausgespuckt.

Das hat einfach den Vorteil von einem URI, der auch dem angezeigten Inhalt entspricht, obwohl die
Schaltflächen/Links, die mit Callback-Funktionen hinterlegt sind eine Kombination aus Session-ID
und der ID des Konkreten Callback-Aufrufs enthält. Und natürlich wird ein zweites Ausführen einer
Aktion durch einen Reload verhindert.

Beispiel:
Benutzer "Admin" möchte einen Benutezr löschen und lässt sich dazu eine Tabelle mit Benutzern
anzeigen. Diese Seite "usertable" enthält pro Zeile einen Link "delete". Beim Erstellen dieser Seite
wurden im Template diese Links erzeugt, indem eine Methode eines Widget-Objekt mit den
Parametern module=usermng, cmd=delete, user=<ID_des_Benutzers > aufgerufen wurde. Diese
hat das jeweilige Commando mit einer ID (md5(uniquid())) versehen, in eine Tabelle in die Session
gepackt und aus dieser ID und der Session-ID den Link zusammengebacken und zurückgegeben.

Klickt also der Besucher nun auf einen sochen "delete"-Link, sieht der Request z.B. so aus:
?cmd=45ab379cd53f14ef2a6bc692cae36f&sid=826abfe0ab fe3428fb3e4ad387ed241
Dieser wird dann also Übersetzt nach Module=User, cmd=delete, user-ID=42. Je nach Ergebnis
dieser Anfrage wird dann z.B. entschieden, die Tabelle erneut anzuzeigen (jetzt ohne den
gelöschten Benutzer), oder eine Sicherheitsabfrage ('Wirklich löschen?') oder sonstwas
anzuzeigen. Die Seite wird zusammengebastelt und unter dem Namen der Seite ('usertable',
'confirm', ...) in die Session gepackt (ggf. noch mit einer ID versehen, falls eine Seite diesen Typs
schon in der Tabelle steht).

Daraufhin gibt es einen Redirect z.B. nach example.com/confirm oder auch example.com/confirm/2
und durch diesen Request wird die bereits fertige Seite aus der Session ausgespuckt.

Und nun wäre es ja denkbar, nach diesem Redirect von dem weiterleitenden Skript noch Jobs
erleigen zu lassen, für die man sonst Cronjobs bemühen würde, die jedoch in keiner Verbindung
zu der gerade angefragten Aktion/Seite etc. stehen, wie eben z.B. aufzuräumen, Mails
rauszuschicken, überarbeitete Dokumentenversionen zu archivieren etc. Eben alles, das weder
punktgenau, noch vor dem Erstellen einer Seite erledigt werden muss.

Das ist eigentlich alles. Und ich halte es weder für sinnlos, noch für problematisch, denn es
unterscheidet sich von einem "gewöhlichen" Cronjob lediglich durch die Ungewissheit des
Zeitpunktes der Ausführung und der Gesamtlaufzeit, die diesen Jobs zur Verfügung steht. Beides
Punkte, die man natürlich beachten muss.

Das einzige Problem, das ich sehe ist die Möglichkeit, dass ein Client mit dem Ausführen des
Redirect warten könnte, bis die Anfrage komplett beantwortet wurde, also eben erst nach den
"Cronjobs". Das wäre letztlch auszuprobieren.

Basti
Basti ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] header location krackmoe PHP Tipps 2008 10 30.07.2008 14:41
header informationen senden auf einem server läufts auf dem anderen nicht tunnel85 PHP Tipps 2008 17 23.04.2008 20:12
readfile vs. header location Adminator PHP Tipps 2008 8 11.09.2007 01:11
header (location: ...) Tigermoon PHP Tipps 2006 4 21.04.2006 13:40
Header Location Suchmaschinentauglich? DonTermi Beitragsarchiv 5 16.08.2005 12:22
Header Location aus Frame für die ganze Seite laden Plague PHP Tipps 2005 3 22.05.2005 16:06
Downloads: Header mal senden, und mal nicht (???) PHP Tipps 2005 2 12.05.2005 00:03
zu anderer php.seite umlenken (ohne header, location:) PHP Tipps 2005 8 06.04.2005 09:42
header erneut senden PHP Tipps 2005 6 05.04.2005 14:55
[Erledigt] Datei selber nach einer Abfrage senden, header() geht nicht? PHP Tipps 2005 2 23.02.2005 05:58
header (location: $var) PHP Tipps 2005 14 19.01.2005 10:37
header (Location - Problem PHP Tipps 2004 4 20.10.2004 02:01
HTML file an client senden PHP Tipps 2004 4 11.09.2004 15:09
header location andrew22 PHP Tipps 2004 1 07.09.2004 12:13
Header Location funktioniert nicht PHP Tipps 2004 10 12.08.2004 17:11

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php client header, php header location flush, echo, flush and header in php, php daten sofort zum client senden, php header location echo flush, header location flush, php flush header location, header senden und weiterlaufen, ob flush echo header

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:55 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.