[PHP] Script laten lopen na header(Location) redirect

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • hbongers
  • Registratie: Januari 2002
  • Laatst online: 18-09 10:40
In een webapplicatie waaraan ik bezig ben roept een php pagina op een andere webserver (van een leverancier) een .asp script aan om daar dingen in een database te laten zetten. Dit kan even duren (enkele seconden) en ik heb er geen uitvoor van nodig voor de loop van mijn php script.

Mijn idee was dus het volgende:

PHP:
1
2
3
4
5
6
7
//invoer checken
//gegevens opslaan in lokale db
// -> alle belangrijke dingen met resultaat gehad

header("Location: http://www.domein.nl/pagina_met_bevestiging_van_invoer.php");

//Verbinding maken via sockets naar .asp script bij leverancier


Dit werkt echter niet goed in IE (6 en 7) deze blijft namelijk toch wachten na de redirect header. FF gaat wel gelijk door naar de volgende pagina.

Ik heb de gewoonte na een Location header altijd een "exit;" te geven zodat het script niet doorloopt.
Mijn logica was dus dat zonder die "exit;" het script door gaat terwijl de browser al geredirect is.

De volgende testcode toont hetzelfde probleem, na de Location header blijft IE wachten tot het script klaar is, terwijl FF en Opera gelijk redirecten. Na 10 seconden verschijnt in alle gevallen het testbestand.

PHP:
1
2
3
4
5
6
7
8
9
header("Location: http://www.tweakers.net", True, 302);
ob_flush();
flush();

sleep(10);

$fh = fopen("d:\\testfile.txt", 'w');
fwrite($fh, "helle world");
fclose($fh);


Iemand enig idee hoe dit probleem op te lossen / te omzeilen valt?

Acties:
  • 0 Henk 'm!

  • jan-marten
  • Registratie: September 2000
  • Laatst online: 20:24
Misschien een stomme suggestie maar wat dacht je ervan de header pas op het einde te geven?

[ Voor 3% gewijzigd door jan-marten op 31-01-2008 14:53 ]


Acties:
  • 0 Henk 'm!

  • Peedy
  • Registratie: Februari 2002
  • Laatst online: 06-11-2024
Kan je anders niet gewoon de inhoud van die PHP pagina waar je heen redirect in deze PHP file gooien?

Acties:
  • 0 Henk 'm!

  • hbongers
  • Registratie: Januari 2002
  • Laatst online: 18-09 10:40
@jan-marten: Dat is juist niet de bedoeling, want dan blijft de browser zeker wachten!
Ik wil dat de gebruiker op de volgende pagina komt en niet hoeft te wachten op wat de webserver verder nog aan het uitvoeren is, die uitvoer is voor de gebruiker namelijk niet belangrijk.

@Peedy: Dat kan wel, maar ook dan blijft de browser hier op wachten.

[ Voor 14% gewijzigd door hbongers op 31-01-2008 14:59 ]


Acties:
  • 0 Henk 'm!

  • sam.vimes
  • Registratie: Januari 2007
  • Laatst online: 08-06 08:44
Ik denk dat je een 'close()' van stdout moet uitvoeren om de verbinding met de IE-client te verbreken. Kennelijk wachten Opera en FF niet op de close, maar reageren ze zodra ze de Location: hebben gelezen.

Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 23:07
Doet je phpfile ook iets met de output? Als de output van de remotefile niet belangrijk is, kun je namelijk gewoon een request doen. Een andere optie is om een extra aanroepbestand te maken. Zodra deze is aangeroepen, handelt deze de communicatie af met met de remote server en kun je de gebruiker doorsturen naar de volgende pagina.

Beetje helder?

"Chaos kan niet uit de hand lopen"


Acties:
  • 0 Henk 'm!

  • jan-marten
  • Registratie: September 2000
  • Laatst online: 20:24
Ik denk dat je deze functie zoekt: ignore-user-abort. Het is een php.ini setting. Of natuurlijk de bijbehorende functie (deze).

[ Voor 28% gewijzigd door jan-marten op 31-01-2008 15:07 ]


Acties:
  • 0 Henk 'm!

  • hbongers
  • Registratie: Januari 2002
  • Laatst online: 18-09 10:40
@sam.vimes: Helaas, fclose(stdout); heeft niet het gewenste resultaat.

@storeman: de output is niet nodig. Wat bedoel je met gewoon een request? Ik doe het nu met fosckopen en fputs.

@jan-marten: ignore-user-abort heeft alleen invloed op het gedrag van PHP na het stoppen van een pageload in de browser, niet op het gedrag van de browser. Je bepaalt of het script stopt, en dat wil ik nou net niet :)

[ Voor 8% gewijzigd door hbongers op 31-01-2008 15:10 ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
PHP:
1
2
3
4
5
6
7
header("Location: http://www.tweakers.net", True, 302);
header('Content-Length: 1');
echo ' ';
flush();
ob_flush();

sleep(10);

Even wat geprutst, en het werkt met IE6 :)

Acties:
  • 0 Henk 'm!

  • hbongers
  • Registratie: Januari 2002
  • Laatst online: 18-09 10:40
Goed bezig GlowMouse, op IE7 werkt het ook :)

de flush() en ob_flush() combi had ik ook al uitgevist, maar het echte verschil onstaat door de regel:
PHP:
1
header('Content-Length: 1');

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
^ Precies, je weet dat (een deel van) de output voor client klaar is en je een dure operatie gaat starten, dus flushen die zooi! :P Ipv een wel erg loze response body, kan je natuurlijk net zo goed 'redirecting...' echo'en.
hbongers schreef op donderdag 31 januari 2008 @ 15:30:
de flush() en ob_flush() combi had ik ook al uitgevist, maar het echte verschil onstaat door de regel:
PHP:
1
header('Content-Length: 1');
In de documentatie/replies van de flush functies staat ook het een ander over user agents welke graag een stukje response body willen ontvangen. ;)

[ Voor 48% gewijzigd door Voutloos op 31-01-2008 15:33 ]

{signature}


Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 23:07
Wat ik bedoel is met behulp van een fopen alleen een request uitvoeren. Vervolgens niet gaan lezen. Hierdoor kun je php of asp op de remote aan het werk zetten, de remote server is bezig, lokaal kun je dan gewoon verder gaan, als je de data toch niet nodig hebt.

"Chaos kan niet uit de hand lopen"


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Nee, dat wil je niet, want dan gaat al je foutafhandeling de deur uit. Normaliter doet je script inderdaad niets meer, maar als die externe partij faalt, zou je tijdens foutafhandeling wel iets mogen doen (bv. mail naar admin sturen).

{signature}

Pagina: 1