Na, das mit den Zeitzonen ist kein Problem, echt nicht. Das 13 und 14 Uhr war auch nur ein fiktiver Wert, der eigentlich so von allen genommen wird. Andere nehmen auch 10 und 14 Uhr oder so. Es geht da um An- und Abreisen. Im Grunde geht es hier nur um ein Datum, also z.B. "2024-04-04" und "2024-04-04"- Das hat halt eine Zeit dabei, damit klar wird, was davon die Abreise und was die Anreise ist. Abreise ist früher, Anreise später. Klar, es kann in ganz entfernten Ländern Probleme geben, das ist technisch möglich. Aber mit den Werten ist es so, dass 99,999999% aller Nutzer kein Problem haben, denn es wird sich durch die verschiedenen Zeitzonen kein Tag an sich ändern. Zielgruppe ist ja primär Europa bzw. eben was in den Zeitzonen -0500 bis +0500.
Wegen den anderen Dingen, da wo Zeiten benutzt werden, die sind nur in DE bzw. eben alle an einem Ort.
Code ist nun stark minimiert, aber nichts Besonderes.
$update_interval = 3600-10;
// -10 Sek, weil der Scriptdurchlauf ein paar Sekunden braucht und der Cron nur im Minutentakt läuft. Der Abstand ist also eine Stunde oder ein paar Sekunden weniger, aber niemals mehr. Würde sich sonst aufschaukeln und jede Stunde mehr werden. Scriptsurchlauf ist ca. 2-5 Sekunden.
$sql = 'SELECT x FROM y AS blki WHERE blki.aktiv = 1 AND blki.next_import < now() LIMIT 25';
// Next_import ist schon ein Wert in der DB, der als +1 Stunde gespeichert wird. Daher einfach der Vergleich, ob der gespeicherte Wert kleiner als der aktuelle Wert ist. Wenn ja, dann ist der Eintrag älter als eine Stunde.
Dann erfolgt die Verarbeitung der Daten, die von extern kamen. Haben aber mit den eigentlichen Zeiten nichts zu tun. Da kommt nur das mit An- und Abreise zu tragen bzw. werden die Daten aufbereitet.
$next_import = date('Y-m-d H:i:s', time()+$update_interval);
$sql = 'UPDATE y SET last_import = \''.$date_last_import.'\', error_count = 0';
if($date_last_modified !== false) $sql .= ', last_modified = \''.$date_last_modified.'\'';
$sql .= ', next_import = \''.$next_import.'\' WHERE uk_id = '.$import['uk_id'];
So, und da ist dann eigentlich auch das Problem. Nicht immer, aber manchmal. Genau suchen konnte ich noch nicht.
Wenn ich also einen Datensatz manuell in der DB eintrage, dann ist "next_import" z.B. aktuell "08:14:22", eben "jetzt" + eine Stunde Intervall. Das sollte dann ja die erste Query erfassen und abfragen. In einer Stunde ab jetzt würde der dann fällig und müsste selektiert werden. Ist aber eben nicht der Fall. Selektiert wird er quasi erst in 3 Stunden. Also die reguläre +1 Stunde und eben die +2 Stunden Sommerzeit.
Beim Update dann wird es wieder seltsam, denn dann geht das GMT / UTC-Spiel wohl umgedreht. Sprich. Wenn der dann endlich mal selectiert hat und dann am Ende das "next_import als neuen Wert in die DB schreibt (updatet), dann ist das keine GMT-Zeit mehr, sondern UTC. Der schreibt dann also kein "10:14:22" rein, was eben dann rechnerisch sein müsste, sondern dann UTC "08:14:22". Also jede Zeit dann entsprechend abzüglich Winter- oder Sommerzeit, rein UTC eben. Und beim nächsten Durchlauf wird dann sofort selectiert, weil "next_update" nicht mehr eine Stunde in der Zukunft ist. Steht dann ja "08:14" in der DB, obwohl in echt schon "10:14" ist.
Also völlig wirr. Erst wird der Zeit +2 Stunden Sommerzeit hinzugerechnet, beim ersten Durchlauf und dann bei jedem weiteren wird jeweils +2 Stunden abgezogen und in die DB geschrieben. Was dazu führt, dass eben der erste Import viel zu spät kommt und dann bei den folgenden keine Pause von einer Stunde. Sondern die gleichen immer wieder jede Minute kommen. Was sinnlos ist, denn es sind ja immer die selben, limitiert mit dem "Limit 25" in der Query. Eigentlich ist die Zeitsperre ja da, damit der an die 900 Importe pro Stunde fährt und dann eben, eine Stunde später, wieder alle durcharbeitet. Jeder Import soll einmal pro Stunde laufen.
Das funktioniert auch alles seit 15 Jahren. Nur eben nicht mehr richtig, seit dem Notumstieg auf einen neuen Server mit PHP 8.2