Ankündigung

Einklappen
Keine Ankündigung bisher.

(Cache?-)Probleme mit fopen und is_file / file_exist [gelöst]

Einklappen

Neue Werbung 2019

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

  • (Cache?-)Probleme mit fopen und is_file / file_exist [gelöst]

    OS: Ubuntu 18.04
    Webserver: apache2 (2.4.29-1ubuntu4.11)
    php: 5.6.40-12+ubuntu18.04.1+deb.sury.org+1

    Ich versuche den Inhalt einer Datei in einen array einzulesen. Der Dateiinhalt verändert sich während einer Sitzung und soll bei einem referesh der Seite daher neu eingelesen werden.

    Ich habe dies mit folgendem Ansatz versucht:

    Code:
    $filename="/tmp/test";
    $handle=fopen($filename, "rb");
    $contents=fread($handle, filesize($filename));
    fclose($handle);
    Obwohl die Datei vorhanden ist, und vom user www-data les- und schreibbar ist, kommt die Fehlermeldung, dass die Datei nicht vorhanden wäre:

    Code:
    "PHP Warning:  fopen(/tmp/test): failed to open stream: No such file or directory"
    
    # ls -la /tmp/test
    -rwxrwxrwx 1 www-data www-data 20 Okt 10 09:35 /tmp/test
    Aufgrund eines Hinweises, dass es sich um ein "caching-Problem" handeln könnte, habe ich es auch mit "clearstatcache" versucht:

    Code:
    clearstatcache();
    $filename = "/tmp/test";
    $handle = fopen($filename, "rb");
    $contents = fread($handle, filesize($filename));
    fclose($handle);

    Das hat das Problem aber auch nicht gelöst. Kann mir jemand weiterhelfen?

    is_file und file_exists liefern als Ergebnis ebenfalls "false".

  • #2
    Dann stimmt der Pfad vermutlich nicht.

    BTW: Warum nimmst du eigentlich nicht https://www.php.net/manual/de/functi...t-contents.php ?

    PHP-Code:
    $content file_get_contents($filename); 
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      file — liest eine komplette Datei in ein Array.

      Kommentar


      • #4
        Ehrlicherweise dachte ich fälschlicherweise file_get_contents($filename) ginge nur mit Dateien aus dem Webverzeichnis, aber es hat das Problem leider auch nicht behoben:

        Code:
        $contents = file_get_contents('/tmp/test');
        Code:
        PHP Warning:  file_get_contents(/tmp/test): failed to open stream: No such file or directory
        Code:
        # ls -la /tmp/test
        -rwxrwxrwx 1 www-data www-data 20 Okt 10 09:35 /tmp/test

        Kommentar


        • #5
          Dann gibt es die Datei nicht an der Stelle. Steht doch in der Meldung.. oder du darfst dort nicht hin.

          Wie ist denn die Struktur? Wo liegt dein Script, wo die Datei. Leg die beiden sonst mal in das selbe Verzeichnis und teste das mal ganz ohne Pfad.

          Ich versuche den Inhalt einer Datei in einen array einzulesen.
          Das hab ich vorher nicht gesehen, da ist file() dann besser, wie oben von jspit erwähnt.
          The string "()()" is not palindrom but the String "())(" is.

          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
          PHP.de Wissenssammlung | Kein Support per PN

          Kommentar


          • #6

            ohne Schrägstrich
            PHP-Code:
            $contents file_get_contents('tmp/test'); 
            oder mit
            PHP-Code:
            $contents file_get_contents(__DIR__ '/tmp/test'); 
            Mit getcwd findest du den Unterschied heraus.

            Kommentar


            • #7
              Zitat von protestix Beitrag anzeigen
              ohne Schrägstrich
              PHP-Code:
              $contents file_get_contents('tmp/test'); 
              Also ich meinte schon den absoluten Pfad "/tmp" und nicht das Unterverzeichnis <webdir>/tmp. Vielleicht liegt hier mein Fehler: Kann man nicht auf Dateien außerhalb des Webserververzeichnisses zugreifen?

              Kommentar


              • #8
                Zitat von hausl Beitrag anzeigen
                Dann gibt es die Datei nicht an der Stelle. Steht doch in der Meldung.. oder du darfst dort nicht hin.
                Wie gesagt, die Datei /tmp/test existiert, sie ist auf 777 und gehört auch dem Apache-User www-data.

                Zitat von hausl Beitrag anzeigen
                Wie ist denn die Struktur? Wo liegt dein Script, wo die Datei. Leg die beiden sonst mal in das selbe Verzeichnis und teste das mal ganz ohne Pfad.
                Die PHP-Datei liegt unter /usr/share/apache2/<vhost>/, die zu lesende Datei im Verzeichnis /tmp


                Kommentar


                • #9
                  Datei liegt innerhalb des document root
                  PHP-Code:
                  $contents file_get_contents($_SERVER['DOCUMENT_ROOT'] .'/tmp/test'); 
                  Datei liegt eine Ebene ausserhalb des document root
                  PHP-Code:
                  $contents file_get_contents($_SERVER['DOCUMENT_ROOT'] .'/../tmp/test'); 
                  Test mit
                  PHP-Code:
                  echo "<pre>";
                  var_export(glob($_SERVER['DOCUMENT_ROOT']."/../*"GLOB_ONLYDIR));
                  var_export(glob($_SERVER['DOCUMENT_ROOT']."/*"GLOB_ONLYDIR));
                  echo 
                  "</pre>"

                  Kommentar


                  • #10
                    Siehe auch: https://php-de.github.io/jumpto/pfade/
                    The string "()()" is not palindrom but the String "())(" is.

                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #11
                      Verstehe ich es also richtig, ich kann nicht mit absoluten Systempfaden arbeiten, sondern muss mit relativen Pfaden (bzw. absolute Pfade vom Webdir) aus arbeiten?

                      Ich verstehe dann aber nicht, warum folgender Code bei einem anderen Projekt auf dem selben Rechner problemlos funktioniert:

                      Code:
                      $fulldir = "/mnt/volume1/dokumente/";
                      // Alle Dateien einlesen
                      $handle = opendir($fulldir);
                      while ($name = readdir($handle))
                      {...}
                      Da habe ich doch auch absolute Systempfade verwendet....

                      Kommentar


                      • #12
                        $_SERVER['DOCUMENT_ROOT'] enthält einen absoluten Pfad.

                        Und eine Datei auf 777 zu setzen ist Quatsch. Beschäftige dich damit, was das überhaupt bedeutet.

                        Kommentar


                        • #13
                          Zitat von hellbringer Beitrag anzeigen
                          Beschäftige dich damit, was das überhaupt bedeutet.
                          Danke für Deine Hilfe, aber ich beschäftige mich schon damit, wie der Name der Datei vermuten lässt ("test"), wurde die Datei natürlich nur zur Fehleranalyse auf 777 gesetzt, um Probleme wegen Berechtigungen auszuschließen.

                          Möglicherweise drücke ich mich auch nur missverständlich aus: Wie geschrieben, habe ich in einem parallel laufenden Projekt einen direkten Verweis auf "/mnt/volume1/dokumente" und nicht, wie vorgeschlagen auf "$_SERVER['DOCUMENT_ROOT'] .'/../mnt/volume1/dokumente'). Dort funktioniert es, aber hier nicht und ich würde nur gerne verstehen, warum.

                          Kommentar


                          • #14
                            Zitat von MonaMeyer Beitrag anzeigen

                            Also ich meinte schon den absoluten Pfad "/tmp" und nicht das Unterverzeichnis <webdir>/tmp. Vielleicht liegt hier mein Fehler: Kann man nicht auf Dateien außerhalb des Webserververzeichnisses zugreifen?
                            Das kommt darauf an ob du dazu berechtigt bist, aber warum willst du da unten hin?
                            Auf meinen lokalem Windows komme ich runter bis auf Laufwerksebene. Auf dem Server geht das sicher nicht und erst recht nicht bei gemietetem Webspace.

                            Erstelle doch eine Verzeichnisebene die parallel zu deinem document root liegt und du bist von Zugriffen von aussen geschützt, das sollte doch reichen und auch möglich sein.

                            Kommentar


                            • #15
                              Zitat von MonaMeyer Beitrag anzeigen
                              "PHP Warning: fopen(/tmp/test): failed to open stream: No such file or directory"
                              Wenn der Apache die Datei selbst erstellt hat, sollte es gehen, auf Dateien die nicht von ihm selbst erstellt wurden hat er aber anscheinend keinen Zugriff. Warum das so ist weiß ich jetzt auch nicht und finde jetzt auch nichts dazu, evtl. hat es was mit dem Sticky-Bit von /tmp zu tun? Als Speicherort für so eine Datei ist /tmp sowieso nicht so geeignet, speicher die Datei besser (wie schon empfohlen) in einem Verzeichnis in dem auch die Dateien zu der Anwendung liegen (oberhalb des Document-Roots).

                              Kommentar

                              Lädt...
                              X