SebastianJu: Dateiänderungsdatum auslesen?

Hallo,

ich möchte über einen Cronjob CSV-Daten in die Datenbank einer Webseite importieren. Die CSV-Daten liegen auf einem anderen Server der übers Internet erreichbar ist. Davor soll aber erst einmal geprüft werden ob eine neuere CSV-Datei vorhanden ist.

Wie kann ich prüfen ob es eine neuere Datei gibt? Also sich die Zeitstempel der letzten Änderung der Datei geändert haben? Die Datei hat immer den selben Namen.

Idealerweise sollte die CSV halt wirklich nur geladen werden wenn sich an ihr etwas geändert hat.

Danke!
Sebastian

  1. Grüße,
    zB filemtime() wenn verfügbar.
    MFG
    bleicher

    --
    __________________________-

    FirefoxMyth
    1. Grüße,
      zB filemtime() wenn verfügbar.

      Ist das für externe Server gemacht? Ich hatte es mit ein paar Dateien getestet und immer nur den 1.1.1970 zurückerhalten. Weshalb ich dachte das wird nur auf dem eigenen Server funktionieren.

      1. Moin!

        Grüße,
        zB filemtime() wenn verfügbar.

        Ist das für externe Server gemacht? Ich hatte es mit ein paar Dateien getestet und immer nur den 1.1.1970 zurückerhalten. Weshalb ich dachte das wird nur auf dem eigenen Server funktionieren.

        Es könnte, aber die Bedingung ist:

        1. PHP muss das für den HTTP-Wrapper unterstützen
        2. Der Server mit der CSV-Datei muss deren Dateidatum via HTTP auch rausrücken.

        Wenn 1. nicht zutrifft, könntest du immer noch auf 2. aufbauen und einen Conditional HTTP-Request zum Server schicken. Der wird dir dann entweder mit Status 304 antworten, oder Status 200 mit Datei.

        Die Frage ist allerdings, ob den Datentransfer immer abzuwickeln und anhand anderer Merkmale festzustellen, ob die CSV-Datei zu importieren ist, nicht leichter zu programmieren ist - insbesondere, wenn eben auch diese zweite Bedingung nicht zutrifft.

        - Sven Rautenberg

        1. Ich werde mir mal die Conditional HTTP-Requests anschauen die Dateien immer runterzuladen wäre nicht so gut weil es einige Dateien sind die zusammen zig MB umfassen.

  2. Hi,

    ich möchte über einen Cronjob CSV-Daten in die Datenbank einer Webseite importieren. Die CSV-Daten liegen auf einem anderen Server der übers Internet erreichbar ist.

    was für ein Server? HTTP? Dann gibt es keine Dateien, nur Ressourcen (die mit real existierenden Dateien im Filesystem der Server-Maschine korrelieren können).

    Davor soll aber erst einmal geprüft werden ob eine neuere CSV-Datei vorhanden ist.

    Dann mach einen HEAD-Request, und werte die HTTP-Header der Antwort aus. Es ist aber nicht garantiert, dass ein Änderungsdatum (Date) darin enthalten ist.

    Noch besser ist, du machst einen bedingten GET-Request, also mit dem Header If-Modified-Since, dann brauchst du nämlich keinen zweiten Request, wenn du die Ressource dann tatsächlich abrufen willst. Im If-Modified-Since-Header gibst du den Zeitstempel an, zu dem du die Daten schon erhalten hast. Wenn der Server den bedingten Request unterstützt und keine neuere Version der Ressource hat, antwortet er mit Status 304 Not Modified, andernfalls liefert er die gewünschte Ressource ganz normal aus.

    So long,
     Martin

    --
    Ich bin 30. Ich demensiere apokalyptisch.
      (Orlando)
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Es ist ein HTTP-Server. Ich werde mal schauen wie man das umsetzt was du beschrieben hast.

  3. Hallo,

    ich habe es jetzt mit get_headers gelöst:

    <?php  
      $header_array = get_headers('http://.../Csv.zip', 1);  
      echo 'Last modified: '. $header_array['Last-Modified'].  
        '<br/>Size: '. $header_array['Content-Length']. $header_array['Accept-Ranges'].  
        '<br/>'. $header_array['Content-Type'];  
    ?>
    

    Ergebnis:~~~php Last modified: Tue, 02 Aug 2011 12:01:18 GMT
    Size: 19937822bytes
    application/x-zip-compressed

      
    Für das zip wird also Last-Modified zurückgegeben und es gibt wohl auch noch ETag, das wohl pro Version wechselt. Damit sollte es möglich sein per Cronjob immer zeitig genug über eine neue Version informiert zu werden bzw diese zu importieren.  
      
    Grüße!  
    Sebastian
    
    1. Moin!

      ich habe es jetzt mit get_headers gelöst:

      <?php

      $header_array = get_headers('http://.../Csv.zip', 1);
        echo 'Last modified: '. $header_array['Last-Modified'].
          '<br/>Size: '. $header_array['Content-Length']. $header_array['Accept-Ranges'].
          '<br/>'. $header_array['Content-Type'];
      ?>

      
      >   
      > Ergebnis:~~~php
      
      Last modified: Tue, 02 Aug 2011 12:01:18 GMT  
      
      > Size: 19937822bytes  
      > application/x-zip-compressed
      
      

      Für das zip wird also Last-Modified zurückgegeben und es gibt wohl auch noch ETag, das wohl pro Version wechselt. Damit sollte es möglich sein per Cronjob immer zeitig genug über eine neue Version informiert zu werden bzw diese zu importieren.

      Das ist die schlechteste Idee. get_headers() sendet einen GET-Request, d.h. du kriegst zwar das Modifikationsdatum, aber PHP holt sich intern die GESAMTE DATEI - und zwar ohne, dass dein Code diese Datei kriegen könnte.

      Das bedeutet, dass das gesamte ZIP bei jedem Testen des Modifikationsdatums transferiert wird - und wenn du feststellst, dass die Datei sich geändert hat, musst du sie danach NOCHMAL vom Server holen.

      Effizient ist anders.

      - Sven Rautenberg

      1. Das ist die schlechteste Idee. get_headers() sendet einen GET-Request, d.h. du kriegst zwar das Modifikationsdatum, aber PHP holt sich intern die GESAMTE DATEI - und zwar ohne, dass dein Code diese Datei kriegen könnte.

        Das bedeutet, dass das gesamte ZIP bei jedem Testen des Modifikationsdatums transferiert wird - und wenn du feststellst, dass die Datei sich geändert hat, musst du sie danach NOCHMAL vom Server holen.

        Effizient ist anders.

        Bist du sicher? Das Ergebnis ist sehr schnell da, auch wenn es einige Minuten dauert wenn ich die Datei wirklich mal runterlade. Wo würde die Datei denn zwischengespeichert wenn sie ohne mein Wissen geladen wird?

        Ich habe jetzt noch mal mit einer neuen Datei getestet. Das Ergebnis war schnell da und es entstand auch nicht der Traffic der nötig gewesen wäre um die Datei zu laden. (Entwickle lokal)

        Aber ich werde morgen noch mal genauer lesen...

        Grüße!
        Sebastian

        1. Sicherheitshalber habe ich es jetzt so umgebaut: ~~~php   $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, 'http://downloads.hotelscombined.com/IndexFiles/HotelListXML.zip');
            curl_setopt($curl, CURLOPT_FILETIME, true);
            curl_setopt($curl, CURLOPT_NOBODY, true);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_exec($curl);
            $info = curl_getinfo($curl);
            curl_close($curl);

          echo '<pre>',print_r($info),'</pre>';
            echo gmdate('d.m.Y G:i:s', $info['filetime'])