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:
und wie erwartet dazugehörig: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)
dann jedochdirekt danach: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)
und dazuCode: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)
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.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)
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

Zitieren

