Problem mit filemtime() beim Vergleich auf zwei Rechnern
Kalle_B
- php
Hallöle,
für das Backup von knapp 200 Programm- und Grafikdateien lasse ich mir filemtime( pfad/dateiname ) vom Host geben und vergleiche mit filemtime( pfad/dateiname ) auf dem lokalen Rechner.
Die Dateizeit auf dem Host ist meistens (aber nicht immer) genau eine Stunde jünger und weicht damit ab von der Zeit, die ich in meinem FTP- Programm (WinSCP) zu derselben Datei sehe.
Die meisten Dateien auf Host und local sollten die gleiche Zeit haben, nur bei Differenzen will ich die (neuere) Datei herunterladen.
Woher kommt die Differenz und wie kann ich sie vermeiden?
LG Kalle
Hallo,
filemtime( pfad/dateiname )
Woher kommt die Differenz und wie kann ich sie vermeiden?
ein Blick ins PHP-Manual sagt uns:
"Returns the time the file was last modified, or FALSE in case of an error. The time is returned as a Unix timestamp ..."
Unix Timestamps sind auf UTC normiert. Ich tippe deshalb mal darauf, dass auf deinem lokalen Rechner die Zeitzone nicht korrekt eingestellt ist (zum Beispiel GMT anstatt MEZ).
So long,
Martin
Hello,
Unix Timestamps sind auf UTC normiert. Ich tippe deshalb mal darauf, dass auf deinem lokalen Rechner die Zeitzone nicht korrekt eingestellt ist (zum Beispiel GMT anstatt MEZ).
Das kann man aber auch locker auf dem "Internet-Host" schaffen. Auf einem unserer Hosts war die zeit jahrelang falsch konfiguriert und immer, wenn ich sie wieder eingestellt hatte, war sie kurze Zeit später wieder falsch. Das ging so lange, bis ich dann vom Provider erfahren habe, dass er immer um Mitternacht eine Synchronisation mit der Atomzeit macht, aber leider einen Fehler im Script hatte...
Es hatte außer mir sowieso niemand bemerkt und dabei hatte er wohl so um die 600 (vermietete) Blades laufen.
Ein harzliches Glückauf
Tom vom Berg
Hallo,
filemtime( pfad/dateiname )
Woher kommt die Differenz und wie kann ich sie vermeiden?ein Blick ins PHP-Manual sagt uns:
"Returns the time the file was last modified, or FALSE in case of an error. The time is returned as a Unix timestamp ..."
Unix Timestamps sind auf UTC normiert. Ich tippe deshalb mal darauf, dass auf deinem lokalen Rechner die Zeitzone nicht korrekt eingestellt ist (zum Beispiel GMT anstatt MEZ).
Der lokale Rechner läuft unter Win2000, der mir jetzt um 22:39 (Funkuhr) die Zeit von 22:33 anzeigt (habe unter meiner Nicht-Admin-Kennung kein Recht, die Uhr einzustellen. Windows eben.).
Habe eine PHP- Datei um 22:31 (spezielle Windows-Zeit) geändert und lade sie um 22:37 (Windows) per FTP auf den Debian-Server in Frankfurt. Das FTP- Programm zeigt mir die Datei dort mit 22:31 an, wie das Original.
Per filemtime() gibt mir Debian jedoch 21:31 zurück.
Kalle
Hello,
Per filemtime() gibt mir Debian jedoch 21:31 zurück.
Genau das hat Dir Martin gerade erzählt. Filemtime() benutzt UTC und nicht die LC_Local-Einstellungen. Die Umrechnung musst Du selber vornehmen.
Ein harzliches Glückauf
Tom vom Berg
Hello,
Per filemtime() gibt mir Debian jedoch 21:31 zurück.
Genau das hat Dir Martin gerade erzählt. Filemtime() benutzt UTC und nicht die LC_Local-Einstellungen. Die Umrechnung musst Du selber vornehmen.
Okay, habe mich unter Win2000 als Admin angemeldet (ungern, wenn ich im Web bin) und die Zeit um die falschen Minuten korrigiert. Die Zeitzone ist MESZ.
Komisch ist folgendes unter Win2000:
Habe das PHP- File geändert und um 22:31 gespeichert, so wird es vom Windows Explorer angezeigt. Unter Win2000 gibt mir filemtime jedoch 19:40 zurück, das war der Stand vor der Änderung.
Ich verstehe nichts mehr. Was macht filemtime denn genau?
Kalle
Win2000 gibt mir filemtime jedoch 19:40 zurück, das war der Stand vor der Änderung.
Mein Fehler am späten Abend, hatte vergessen, die neue Datei auf dem lokalen Rechner in den Server-Bereich zu kopieren.
Zur Zeitumrechnung von UTC auf MESZ muss ich also wissen, welches Betriebssystem der Server hat? Bei Debian muss ich eine Stunde hinzurechnen, bei Win2000 nicht.
Das kann doch nicht im Sinne des Erfinders von filemtime sein.
Kalle
Hello,
Das kann doch nicht im Sinne des Erfinders von filemtime sein.
Da gebe ich Dir recht und gelobe, es auch noch mal selber nachzuvollziehen, sowie ich Win2000 auf meiner "RTM" (Reise-Test-Maschine) wieder zum Laufen gebracht habe...
Die Linuxe laufen alle, aber Win2000 läuft immer nur solange, bis ich den Fritz-WLAN-Stick versuche in Betrieb zu nehmen.
Aber zu Deinem Problem zurück:
Du wirst nicht darum herum kommen, die Spezifikationen (Manuals) für PHP auf Linux und PHP auf Windows vollständig durchzugehen und ggf. sogar in den Quellcode einzusteigen. Derartige logische Fehler haben die PHP-Programmer aber schon mehrere produziert und wenn man sie darauf anspricht, werden sie nur pampig. So ist es mir z.B. ergangen mit Hinweisen zu DIO (Mandatory Locking) und Advisory Locking. Der Fehler wurde aber dann später trotzdem beseitigt...
Ein harzliches Glückauf
Tom vom Berg
Hallo Kalle,
Zur Zeitumrechnung von UTC auf MESZ muss ich also wissen, welches Betriebssystem der Server hat? Bei Debian muss ich eine Stunde hinzurechnen, bei Win2000 nicht.
Hä? Verstehe ich nicht, beschreibe Dein Problem doch bitte nochmal.
filemtime() ist in PHP ein Wrapper auf die entsprechenden Systemfunktionen um das Modifikationsdatum einer Datei zu erhalten. filemtime() gibt Dir *immer* einen POSIX-Timestamp zurück. Ein POSIX-Timestamp ist definiert als die Anzahl an Sekunden (Schaltsekunden nicht berücksichtigt) seit dem 1.1.1970 00:00:00 UTC. (Ein Timestamp ist nicht "in UTC", er ist lediglich eine absolute Zahlenangabe seit (!) einem Zeitpunkt, der in UTC definiert ist, Du kannst Dir aber auch gerne die vollkommen äquivalente Definition merken, die besagt, dass ein POSIX-Timestamp die Anzahl an Sekunden seit dem 1.1.1970 01:00:00 MEZ angibt).
Wenn Du also eine Datei unter einem beliebigen Betriebssystem auf dem PHP läuft zu einem bestimmten Zeitpunkt modifizierst, dann muss PHPs filemtime() Dir die Anzahl an Sekunden zwischen dem Zeitpunkt und dem Referenzzeitpunkt von Timestamps zurückgeben. Immer. Alles andere wäre ein Bug in PHP [*].
Das heißt:
echo date("Y-m-d H:i:s", filemtime ('datei.txt'));
sollte Dir *immer* die gleiche Zeit liefern, wie sie auch die Betriebssystemutilities für diese Datei liefern.
Wenn es nicht passt, erkläre doch mal bitte genau und detailliert, was Du machst, was daraufhin passiert und warum Du das Verhalten als Fehler ansiehst.
Viele Grüße,
Christian
[*] Ausnahme wäre höchstens gerade im Moment der Zeitumstellung, da kann es unter Windows u.U. zu Problemen kommen, weil die Lokalzeit da nicht unbedingt eindeutig ist und Windows das dummerweise in Lokalzeit speichert. Der angezeigte (!) Wert sollte aber trotzdem übereinstimmen.
Viele Grüße,
Christian
(Hallo|Hi(ho)|Tag|Mahlzeit) Kalle_B,
Zur Zeitumrechnung von UTC auf MESZ muss ich also wissen, welches Betriebssystem der Server hat? Bei Debian muss ich eine Stunde hinzurechnen, bei Win2000 nicht.
Ich würde eher den umgekehrten Weg gehen, denn UTC hat keine "verlorenen" und keine "zusätzlichen" Stunden, wie die MEZ|MESZ. Zum Vergleichen von Änderungsdaten eignet sie sich also besser.
Das kann doch nicht im Sinne des Erfinders von filemtime sein.
Ist es auch nicht, aber Windoze-Betriebssysteme müssen Rücksicht auf eingebaute Fehler ihrer Vorgängerversionen nehmen, damit sich die User nicht wundern, warum ein liebgewonnenes Fehlverhalten des Computers nach einem Update auf eine neuere Windoze-Version plötzlich verschwunden ist.
Du findest im PHP-Handbuch einige Info-Häppchen zu dem Problem (und Lösungsversuche) über verschiedene Datei-Info-Funktionen verstreut in den Benutzerkommentaren:
filemtime(): (kbrobst at surveyresearchpartners dot com)
stat(): (mail4rico at gmail dot com)
stat(): (admin at smitelli dot com)
stat(): (Re note posted by "admin at smitelli dot com")
Es wird auch die wahrscheinlich einzige dauerhaft funktionierende Lösung beschrieben: ;-)
Just another example of why 'not' to use windows in a server room.
Die vom letzten Post verlinkte Seite beschreibt das Daylight-Savings-Feature genauer:
http://www.codeproject.com/KB/datetime/dstbugs.aspx
MffG
EisFuX