Ankündigung

Einklappen
Keine Ankündigung bisher.

Scriptabbruch bei Aufruf per fopen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Scriptabbruch bei Aufruf per fopen

    Hallo zusammen,

    ich habe ein Script, dass ohne Fehlermeldung abbricht, abhängig davon wie es aufgerufen wurde.

    Beim Start per Browser läuft es komplett durch. Beim Start per fopen (siehe unten) kommt es zum Abbruch.

    PHP-Code:
    $fp=fopen('http://domain.de/script.php',"r");
    fclose($fp); 
    Das Script selbst (also script.php) macht nichts weiter als per Schleife Dateien auf Existenz zu prüfen.
    Der Abbruch erfolgt wiederholbar und sehr schnell, nach Durchlauf von 10 - 20 Dateien und es gibt keine Fehlermeldung (das befüllen vom Array $img ist nicht im Beispiel enthalten).

    PHP-Code:
    for($x=0;$x<count($img);$x++)
    {
      if(
    file_exists($img[$x]))
      {
        
    //do nothing
      
    }

    Es scheint so zu sein, dass der Fehler nur auftritt bei der Verwendung von PHP-Befehlen die auf das Dateisystem gehen (file_exists, unlink, etc.).

    Ich hatte zunächst den Verdacht, dass es sich um eine defekte Datei handelt, die Sache lässt sich aber mit beliebigen anderen Dateien wiederholen und dann würde die Art des Script-Aufrufs vermutlich auch keinen Unterschied machen.

    Serverumgebung: Apache, Linux Gentoo, PHP 7.3.10

    Florian

  • #2
    Woher weißt du, dass das Script abbricht? Wenn es abbricht gibts auch eine Fehlermeldung im PHP-Error-Log und die sollte man lesen.

    Kommentar


    • #3
      Ich schreibe eine Logdatei, mit je einem Eintrag vor und einem Eintrag nach dem file_exists.
      Im regulären Error-Log ist kein Eintrag zu dem Abbruch vorhanden.

      Der Eintrag START und FIN, wird jeweils ganz am Anfang bzw. am Ende erzeugt.

      Log bei fopen:

      Code:
      12:53:24|START
      12:53:24|A!|./tmp/142401634_mini.jpg
      12:53:24|B!|./tmp/142401634_mini.jpg
      12:53:24|A!|./tmp/142401634_small.jpg
      12:53:24|B!|./tmp/142401634_small.jpg
      [...]
      12:53:24|A!|./tmp/142401642_xxxl.jpg
      12:53:24|A!|./tmp/142401642_xxxxl.jpg
      12:53:24|A!|./tmp/142401642_mida.jpg
      12:53:24|A!|./tmp/142401642_midb.jpg
      Log bei Browser-Aufruf:

      Code:
      12:53:58|START
      12:53:58|A!|./tmp/142401634_mini.jpg
      12:53:58|B!|./tmp/142401634_mini.jpg
      12:53:58|A!|./tmp/142401634_small.jpg
      12:53:58|B!|./tmp/142401634_small.jpg
      12:53:58|A!|./tmp/142401634_midi.jpg
      [...]
      12:53:58|A!|./tmp/180511663_mida.jpg
      12:53:58|A!|./tmp/180511663_midb.jpg
      12:53:58|A!|./tmp/180511663_midc.jpg
      12:53:58|A!|./tmp/180511663_midd.jpg
      12:53:58|FIN

      Kommentar


      • #4
        Du zeigst hier Ausgaben, die im PHP-Code nicht ersichtlich sind.

        Bitte ein vollständiges Codebeispiel posten, das jeder bei sich ausführen kann.

        Kommentar


        • #5
          Ich habe soeben eine Rückmeldung vom Hoster erhalten: es handelt sich um einen Defekt vom Dateisystem (ein Problem mit einem Cache, wenn ich es richtig verstehe) und betrifft mehrere Verzeichnisse.
          Ich habe nicht verstanden wie das mit dem fopen zusammenhängt, aber das Problem konnte dort gelöst werden.

          Vielen Dank, für die Unterstützung!

          Kommentar


          • #6
            Ja, Dateisystem... sicher! Das Problem ist dein Script:

            PHP-Code:
            $fp=fopen('http://domain.de/script.php',"r");
            fclose($fp); 
            Du öffnest ein Stream und schließt ihn sofort wieder. Je nach Konfiguration des Zeilsystems bricht damit auch das Script ab. Du musst warten bis der Request durch ist, was in dem Fall heißt, solange Daten aus dem Stream lesen bis Ende ist. Wenn da als Response keine 10GB zurück kommen, kannst du das mit stream_get_contents($fp); machen, oder gleich direkt mit file_get_contents('http://domain.de/script.php');. Ansonsten mit Schleife und fgets() oder fread()/feof().

            Kommentar


            • #7
              Das Script läuft. Ohne Änderung, mit fopen und direktem fclose.

              Ich hatte im Vorfeld, bei der Fehlersuche, auch eine andere Form des Script-Aufrufs getestet (file_get_contents ~ mit gleichem Fehlerbild).

              ... das aufrufende Script soll nicht auf eine Rückgabe warten, diese wird nicht benötigt - es geht nur darum den Vorgang auf dem externen System anzustoßen.

              Sollte ein fopen/fclose (immer/auf jedem System) Scripte mitten in der Verarbeitung abbrechen lassen würde ich das für sehr bedenklich halten.
              Es handelt sich um einen externen Zugriff, der nicht unmittelbar kontrollierbar ist.
              Im besten Fall beschädigt es Daten auf dem System. Im schlechtesten hat es Auswirkungen auf die Sicherheit.

              Zitat von erc Beitrag anzeigen
              Je nach Konfiguration des Zeilsystems ...
              D.h. ich kann irgendwo einstellen ob mein Script abbricht oder nicht?

              Kommentar


              • #8
                Im Prinzip ist alles möglich. Ich bin aber ein Fan von einfachen Erklärungen. Eine vorzeitig beendete TCP Verbindung erscheint mir sehr viel naheliegender als ein Dateisystem was zwischen HTTP-Clients unterscheidet.

                Zitat von fschoe Beitrag anzeigen
                D.h. ich kann irgendwo einstellen ob mein Script abbricht oder nicht?
                Ich meine hier mehr wie PHP und der Webserver zusammenhängen (insbesondere ob mod_php oder php fpm).

                https://www.php.net/manual/de/functi...user-abort.php
                https://www.php.net/manual/en/featur...n-handling.php

                Kommentar


                • #9
                  Ich kann nicht sehen was seitens Provider tatsächlich gemacht wurde, aber ignore_user_abort würde hier wirklich gut passen. War mir bis dato nicht bekannt.

                  Kommentar

                  Lädt...
                  X