Hallo Helmut!
Bei einer Contao-Installation (contao 2.10.2, calendar_ical 1.3.1 stable Build 10) ist mir aufgefallen, dass es zu mehrfachen, konkurrierenden Aufrufen von CalendarImport::importFromICS() kommen kann.
Die Installation fragt regelmässig einen umfangeichen (~800 Einträge) Google Kalender über http ab. Der Import funktioniert sehr gut, es dauert jedes Mal ca. 15 Sekunden, bis er abgearbeitet ist. Wenn der Import jedoch im Frontend durch den Besuch eines Bots ausgelöst wird, der dann ja mit ziemlicher Geschwindigkeit hintereinander die Seiten abgrast, kommt es vor, das mit einigen Sekunden Abstand der Import zwei Mal ausgelöst wird. Bei besonders schnellen Spidern, die Seiten im Mikrosekundentakt aufrufen, überschneiden sich die Importvorgänge noch eher und der Import kommt ins Stolpern.
Beispielausgabe im System-Log:
Code:
ID: 321
Datum: 17.10.11 12:13
Ursprung: Backend
Kategorie: GENERAL
Benutzer:
Details: reading cal
Funktion: CAlendarImport importFromICS()
IP Adresse: 66.249.72.147
Browser: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
und wie erwartet dazugehörig:
Code:
ID: 322
Datum: 17.10.11 12:13
Ursprung: Backend
Kategorie: GENERAL
Benutzer:
Details: Reload iCal Web Calendar Termine (1): Triggered by 1318846428 - 1318824359 = 22069 > 3600
Funktion: CalendarImport::importCalendarWithID()
IP Adresse: 66.249.72.147
Browser: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
dann jedochdirekt danach:
Code:
ID: 323
Datum: 17.10.11 12:13
Ursprung: Frontend
Kategorie: GENERAL
Benutzer:
Details: reading cal
Funktion: CAlendarImport importFromICS()
IP Adresse: 66.249.72.147
Browser: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
und dazu
Code:
ID: 324
Datum: 17.10.11 12:13
Ursprung: Frontend
Kategorie: GENERAL
Benutzer:
Details: Reload iCal Web Calendar Termine (1): Triggered by 1318846434 - 1318824359 = 22075 > 3600
Funktion: CalendarImport::importCalendarWithID()
IP Adresse: 66.249.72.147
Browser: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Aus den angegebenen Zeitwerten kann man sehen, dass die Aufrufe hintereinander liegen, ich gehe daher dovon aus, das der erste Import-Aufruf noch nicht abgeschlossen ist und daher der Zeitstempel noch nicht aktualisiert ist, wodurch der zweite, konkurrierende Aufruf ausgelöst wird.
Eigentlich nicht so wild, in 90% der Fälle ist das Ergebnis einfach ein fertig importierter Kalender. Leider tritt jedoch vermehrt auch der Fall auf, in dem ein wesentlich agressiver agierender Bot verschiedene Seiten, die Ansichten des Kalenders enthalten, in so schneller Folge aufruft, dass im Ergebnis der Import nicht abgeschlossen wird, sondern nur ein Bruchteil des Kalenders importiert wird. Den Grund hierfür kann ich nicht genau erkennen (zu viele gleichzeitige Aufrufe und dadurch mögliche Terminierung des Prozess-Stakkatos durch den Host?), aber der Zusammenhang scheint zu bestehen. Das legen die Einträge im System Log einfach nahe. Da es sich immer wieder um andere (teilweise obskure) Bots handelt, ist das Sperren der entsprechenden Spider leider keine nachhaltige Lösung.
Hast du evtl. eine Idee, wie man den Fehler vermeiden könnte? Mein einziger Einfall wäre, das Update des Kalenders in den Contao cron Mechanismus auszulagern. Seit Contao 2.10 kann ich den Aufruf der cron.php über das Frontend ja in den Einstellungen deaktivieren und dann selbst über einen externen Cronjob erledigen. Natürlich hätte man dann nur noch die Möglichkeit, den Kalender stündlich, täglich oder wöchentlich aktualisieren zu lassen, aber das würde für meine Fälle ausreichen. Den Aufwand hierfür kann ich nicht abschätzen, ebensowenig, ob man die Einbindung in den Contao Cron im Backend einfach optional zum bestehenden Mechanismus anbieten könnte.
Wäre das vielleicht ein sinnvoller Feature Request, oder übersehe ich etwas?
Viele Grüße
Jannik
Lesezeichen