Abbrechen des Ladens einer Seite

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Abbrechen des Ladens einer Seite

    Hi nochmal, ich da schon wieder die nächste Frage.

    Ich weiss nicht genau, ob es hier her gehört, aber da es mit PHP zusammenhängt und ich hier fähige Leute vermute, die wissen, was es damit auf sich hat, möchte ich sie hier stellen:

    Wenn ich ein PHP-Script auf meinem Apache mit dem Browser anfrage, dann startet ja der Apache das Script - wenn ich nun auf abbrechen klicke, oder einen anderen Link auf der gleichen Seite aufrufe, dann lädt der Server das Script aber trotzdem bis zuende, was dann leider mit erheblichen Zeitverlust zusammenhängt.
    Meine Frage: wie kriege ich meinen Server dazu, ein PHP-Script abzubrechen, wenn die Anfrage vom Browser nicht mehr besteht? Besteht überhaupt die Möglichkeit dazu ?

    MfG
    wurst
  • Eigentlich gibt es nur eine Funktion, die das ermöglicht. Sprich eigentlich stopt das Script immer, wenn der Browser auf Stop ist.
    Na ja, könntest das aber mit PHP teils beweltigen ;)

    PHP-Quellcode

    1. <?php
    2. register_shutdown_function('Funktiondienuronlineausgeführtwerdenkann');
    3. function Funktiondienuronlineausgeführtwerdenkann($einevariabel){
    4. if(connection_aborted()) exit;
    5. echo $einevariabel."<br />";
    6. }
    7. for($x=1; $x<10; $x++){
    8. Funktiondienuronlineausgeführtwerdenkann($i);
    9. }
    10. ?>
    Alles anzeigen


    Aber eigentlich geht es gar nicht, dass der Apache automatich weiterläuft ~~"
    Also jedenfalls ist mir das nicht bekannt. Vielleicht ist ja deine Verbindung zu langsam^^"
  • Hmm, Verbindung zu langsam kann ich mir bei localhost kaum vorstellen ;) - aber vielleicht ja Prozessor zu langsam (Server läuft auf 450Mhz-Laptop) oder so ... wer weiss - also, ich hab mal deinen Quelltext ein wenig verändert getestet:

    PHP-Quellcode

    1. <?php
    2. register_shutdown_function('exitfunc');
    3. function exitfunc(){
    4. global $x;
    5. //if(connection_aborted())
    6. //{
    7. $file = fopen("test.txt","a");
    8. fwrite($file,$x);
    9. fclose($file);
    10. exit();
    11. //}
    12. }
    13. for($x=1; $x<10; $x++){
    14. //exitfunc();
    15. echo $x."<br>";
    16. }
    17. ?>
    Alles anzeigen

    Seltsamerweise wird die deklarierte Shutdown-Function aber gar nicht aufgerufen, egal ob ich das Script durchlaufen lasse (was bei $x<10 ja auch recht schnell geht), oder $x<100000 einsetze und nach 3000 abbreche - in keinem Fall wird eine test.txt angelegt - hat irgendjemand eine Ahnung, woran es liegen könnte ?? Bin da ja ehrlich gesagt ein wenig ratlos ...
    Ganz davon ab wird aber laut de.php.net das Script auch Standardmäßig abgebrochen sobald die Verbindung auf irgendeine Art und Weise beendet wird, wenn nicht register_shutdown_function() aufgerufen wurde... Wurde es doch aber bei mir ?!

    Also, ich finds seltsam ...
    Mit ratlosen Grüßen
    wurst
  • doch, eigentlich müsste das Script dann doch so ablaufen, dass, egal ob nun abgebrochen oder durchgelaufen, der Wert von $x in die Datei geschrieben wird, weil als shutdown_function, die laut php.net immer beim ende des scripts ausgeführt wird, egal ob abgebrochen oder nicht, ja exitfunc() definiert ist - oder vertue ich mich jetzt komplett ?!

    MfG
    wurst
  • Hmm.. habs nur so hingekriegt, dass du eine Funktion, die man angefangen hat zuende laufen lassen kann :)
    Das find ich schonma gut. Doch bringt dich das ja nicht wirklich weiter :D
    Sende Trotzdem mal den Code:

    PHP-Quellcode

    1. <?PHP
    2. register_shutdown_function('exitfunc');
    3. ignore_user_abort();
    4. function exitfunc(){
    5. for($x=1;$x<=10;$x++){
    6. $file = fopen('test.txt','a');
    7. flush();
    8. usleep(1000000);
    9. fwrite($file,$x);
    10. fclose($file);
    11. echo $x."<br>";
    12. }
    13. }
    14. exitfunc();
    15. ?>
    Alles anzeigen

    habs auch mal mit if(connection_aborted())exit; probiert aber irgendwie ohne erfolg (connection_status() ist immer 0 ;()

    Ach, und führ mal den Script aus (stoppe es natürlich irgendwann^^) und sag mir ob dann zumschluss die Datei "hallo.txt" sich verändert hat. Sprich ob dein Server wirklich automatich weiter macht.

    PHP-Quellcode

    1. <?php
    2. flush();
    3. usleep(100000000);
    4. $fp = fopen('hallo.txt','a');
    5. fwrite($fp,'hallo, es geht wirklich weiter');
    6. fclose($fp);
    7. ?>
  • Also, ich hab das ganze mit sleep(15) mal ein wenig humaner gestaltet ;) und die Seite nur kurz "angeladen" und das Laden sofort wieder abgebrochen - und siehe da: so ziemlich exakt 15 sekunden nach laden der Seite bekam ich ne neue Datei ... Also scheint mir doch zumindest bewiesen, dass der Stop-Button des Browsers bei meinem Server nix zu bringen scheint, oder ?
    Hat nicht irgendjemand ne Lösung ?

    MfG
    wurst
  • hmmm ... testet mal das:

    PHP-Quellcode

    1. <?php
    2. // skript soll bei stop-button angehalten werden
    3. ignore_user_abort(0);
    4. // skript soll trotz stop-button weiterlaufen
    5. //ignore_user_abort(1);
    6. /************************************************/
    7. set_time_limit(0);
    8. $fp = fopen('abort.txt', 'w');
    9. if (ob_get_level() == 0) {
    10. ob_start();
    11. } // END if
    12. for ($i = 1; $i <= 60; $i++) {
    13. echo 'Run #'.$i.'<br />';
    14. sleep(1);
    15. $fw = fwrite($fp, 'Run #'.$i."\r\n");
    16. ob_flush();
    17. flush();
    18. }
    19. $fc = fclose($fp);
    20. ob_end_flush();
    21. ?>
    Alles anzeigen


    fuer ignore_user_abort(0): browser-output und abort.txt sollten das gleiche sein! +/- 2 eintraege, da php anscheinend ein wenig ueberlegt, ob es wirklich abbrechen soll!? ,-)

    fuer ignore_user_abort(1): browser-output bleibt stehen, z.b.: Run #5! aber das skript laeuft im hintergrund weiter und abort.txt hat in der letzten zeile Run #60 stehen!

    BTW: wenn ich bei meinem server ignore_user_abort(BOOL) ueberhaupt nicht verwende, ist das ergebnis das gleiche wie ignore_user_abort(0)!! also, mein apache2 stoppt das php skript, bei user abort sowieso!!

    ceeyaa.MeX
  • Hi MeX

    Anscheinend hast du Recht - aber ich frag mich trotzdem, warum es bei den beiden vorherigen Versuchen nicht geklappt hat/bzw. immer noch nicht klappt ?!
    PHP scheint etwas zu brauchen, um zu erkennen, dass die connection abgebrochen worden ist, beim script

    PHP-Quellcode

    1. <?php
    2. ignore_user_abort(1);
    3. set_time_limit(0);
    4. $fp = fopen('abort.txt', 'w');
    5. for ($i = 1; $i <= 5000; $i++) {
    6. echo 'Run #'.$i.'<br />';
    7. $fw = fwrite($fp, 'Run #'.$i." : ".connection_status()." : ".connection_aborted()."\r\n");
    8. }
    9. $fc = fclose($fp);
    10. ?>
    Alles anzeigen
    werden z.B. selbst bei sehr kurzem Laden erst nach dem ca. 1400sten Durchlauf Einsen eingetragen ... Warum aber wird bei

    PHP-Quellcode

    1. <?php
    2. ignore_user_abort(0);
    3. echo connection_aborted();
    4. flush();
    5. sleep(15);
    6. $fp = fopen('hallo.txt','a');
    7. fwrite($fp,'hallo, es geht wirklich weiter');
    8. fwrite($fp,connection_aborted());
    9. fwrite($fp,connection_status());
    10. fclose($fp);
    11. ?>
    Alles anzeigen
    der Status nicht erkannt, und warum wird die shutdown-funktion nicht ausgeführt ?
    Ich finds allemal seltsam ... :confused:

    Naja, falls noch jemand ideen hat - ich bin für alles offen ;)
    MfG, schönen Dienstag
    wurst
  • whoops ... sry, habe das hier irgendwie total uebersehen!? *schaem*

    also, beim ersten snippet isses so, dass durch das ignore_user_abort(1); der browser output z.b. bei Run #3360 stehenbleibt, der inhalt von abort.txt weiter befuellt wird!! somit der letzte eintrag ist: Run #5000 : 0 : 0!!
    das ist so OK!!

    beim zweiten, bin ich ehrlich gesagt auch ein wenig ueberrascht!! denn ganz egal wann ich es abbreche, es wird die datei hallo.txt immer erstellt!? warum? sry, keine ahnung!?

    ich bin mir allerdings sicher, dass php bzw. der www-sever keine resourcen mehr fuer ein 'abgebrochenes' script vergibt!! deshalb glaube ich, dass deine performance probleme woanders liegen!!

    ich bin mir allerdings NICHT sicher, ob ich diesen thread jetzt unnoetigerweisen wieder aufwaerme, weil du das prob eh schon geloest hast!? lass es uns wissen! die community hilft!! ^^

    ceeyaa.mex