Ergebnis 1 bis 10 von 10

Thema: Bots triggern CalendarImport::importFromICS() mehrfach hintereinander

  1. #1
    Contao-Nutzer
    Registriert seit
    10.03.2010.
    Ort
    Flensburg
    Beiträge
    16

    Standard Bots triggern CalendarImport::importFromICS() mehrfach hintereinander

    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

  2. #2
    Contao-Fan Avatar von hschottm
    Registriert seit
    15.06.2009.
    Ort
    Loxstedt, Germany
    Beiträge
    825
    User beschenken
    Wunschliste

    Standard Bots triggern CalendarImport::importFromICS() mehrfach hintereinander

    Hi Jannik,

    da werde ich am besten mal einen lock einbauen, den ich fest in der Datenbank habe und der dafür sorgt dass nur eine Aktualisierung zur Zeit stattfindet.

    Gruß,
    Helmut

    Zitat Zitat von janfux Beitrag anzeigen
    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
    Blackmail's such an ugly word. I prefer extortion -- the "x" makes it sound cool.
    -- Bender

  3. #3
    Contao-Fan Avatar von hschottm
    Registriert seit
    15.06.2009.
    Ort
    Loxstedt, Germany
    Beiträge
    825
    User beschenken
    Wunschliste

    Standard

    Ok,

    hab gerade eine neue Version rausgebracht, die zu Beginn eines Aktualisierungsvorgangs einen Lock in die Datenbank schreibt und am Ende des Aktualisierungsvorgangs wieder entfernt. Solange der Lock gesetzt ist, kann dieser Kalender auch nicht aktualisiert werden.

    Gruß,
    Helmut
    Blackmail's such an ugly word. I prefer extortion -- the "x" makes it sound cool.
    -- Bender

  4. #4
    Contao-Nutzer
    Registriert seit
    10.03.2010.
    Ort
    Flensburg
    Beiträge
    16

    Standard

    Hallo Helmut,

    danke für die neue Version. Bisher funktioniert deine Lösung zuverlässig trotz regen Interesses diverser Spider-Bots an der Seite! Großes Dankeschön für die schnelle und professionelle Unterstützung!

    Zitat Zitat von hschottm Beitrag anzeigen
    Ok,

    hab gerade eine neue Version rausgebracht, die zu Beginn eines Aktualisierungsvorgangs einen Lock in die Datenbank schreibt und am Ende des Aktualisierungsvorgangs wieder entfernt. Solange der Lock gesetzt ist, kann dieser Kalender auch nicht aktualisiert werden.

    Gruß,
    Helmut

  5. #5
    Contao-Nutzer
    Registriert seit
    10.03.2010.
    Ort
    Flensburg
    Beiträge
    16

    Standard

    Zitat Zitat von hschottm Beitrag anzeigen
    Ok,

    hab gerade eine neue Version rausgebracht, die zu Beginn eines Aktualisierungsvorgangs einen Lock in die Datenbank schreibt und am Ende des Aktualisierungsvorgangs wieder entfernt. Solange der Lock gesetzt ist, kann dieser Kalender auch nicht aktualisiert werden.

    Gruß,
    Helmut
    Hi,

    ein kleines Problem taucht jetzt noch auf: wenn die Operationen zwischen anlegen des locks in der db und dem Abschluss nicht erfolgreich abgeschlossen werden, habe ich ein stale lock in der db, dass dann alle weiteren Updateläufe für immer unterdrückt. Wenn dann beim letzten Updatelauf keine Termine in der Datenbank eingetragen wurden, ist die Termintabelle leer...

    Bei mir tritt das bei Seitenbesuchen durch eine Reihe von sehr schnellen und sehr aggressiven Bots auf, die scheinbar "keine Geduld" mit der Seite haben - immer, wenn diese Bots die Seite besuchen, sehe ich im Log den Beginn des ical Reloads, aber die Tabelle tl_calendar_events ist leer und das Lock bleibt in der db.

    Wäre es nicht eine Möglichkeit, das Lock zu übergehen, wenn zwischen dem Anlegen des Locks und dem Aufruf der import-Routine ein sinnvoller Zeitabstand liegt, z.b. die php max exec time? Dann könnte das Import Skript ja theoretisch gar nicht mehr laufen und man könnte das lock resetten bzw. einfach übergehen - bei Abschluss des Imports würde es dann gelöscht.

    Viele Grüße
    Jannik

  6. #6
    Contao-Fan Avatar von hschottm
    Registriert seit
    15.06.2009.
    Ort
    Loxstedt, Germany
    Beiträge
    825
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von janfux Beitrag anzeigen
    Hi,

    ein kleines Problem taucht jetzt noch auf: wenn die Operationen zwischen anlegen des locks in der db und dem Abschluss nicht erfolgreich abgeschlossen werden, habe ich ein stale lock in der db, dass dann alle weiteren Updateläufe für immer unterdrückt. Wenn dann beim letzten Updatelauf keine Termine in der Datenbank eingetragen wurden, ist die Termintabelle leer...

    Bei mir tritt das bei Seitenbesuchen durch eine Reihe von sehr schnellen und sehr aggressiven Bots auf, die scheinbar "keine Geduld" mit der Seite haben - immer, wenn diese Bots die Seite besuchen, sehe ich im Log den Beginn des ical Reloads, aber die Tabelle tl_calendar_events ist leer und das Lock bleibt in der db.

    Wäre es nicht eine Möglichkeit, das Lock zu übergehen, wenn zwischen dem Anlegen des Locks und dem Aufruf der import-Routine ein sinnvoller Zeitabstand liegt, z.b. die php max exec time? Dann könnte das Import Skript ja theoretisch gar nicht mehr laufen und man könnte das lock resetten bzw. einfach übergehen - bei Abschluss des Imports würde es dann gelöscht.

    Viele Grüße
    Jannik
    Moin Jannik,

    ich hab's befürchtet. Dann werde ich zusätzlich eine Lösch-Schranke von 60 oder 120 Sekunden einbauen. ich denke das sollte reichen. Ein Kalender, der länger als diese Zeit braucht, um importiert zu werden, wird wahrscheinlich nicht so oft verwendet.

    Ich setz mich gleich mal dran.

    LG,
    Helmut
    Blackmail's such an ugly word. I prefer extortion -- the "x" makes it sound cool.
    -- Bender

  7. #7
    Contao-Fan Avatar von hschottm
    Registriert seit
    15.06.2009.
    Ort
    Loxstedt, Germany
    Beiträge
    825
    User beschenken
    Wunschliste

    Standard

    Hi Jannik,

    eine aktualisierte Version ist online.
    Wäre toll, wenn du mir von deinen Erfahrungen berichten könntest. Ich hebele den Lock jetzt immer aus, wenn er älter ist als 2 Minuten, das sollte eigentlich für alle Import-Skripte genug Zeit sein. Ich glaube, spätestens nach 2 Minuten ist der Prozess sonst auf den meisten Servern, die ich kenne auch abgeschossen

    Gruß,
    Helmut
    Blackmail's such an ugly word. I prefer extortion -- the "x" makes it sound cool.
    -- Bender

  8. #8
    Contao-Nutzer
    Registriert seit
    28.01.2011.
    Beiträge
    113

    Standard

    Hallo,

    ich klinke mich hier mal rein, da ich ein sehr dringendes Problem habe, dass mir dem oberen sehr ähnlich scheint. Ich verwende Contao 3.0.6 und calendar_ical 3.0.0

    Wenn sich ein Bot bei mir anfragt, dann sind die einzelnen Events zwar noch da, aber neu angelegt und ohne Inhalte. Zudem wird der Titel des Events um den Seitentitel erweitert.

    Im Log landen folgende Einträge:

    ID: 4377
    Datum: 14.5.2013 18:42
    Ursprung: Frontend
    Kategorie: GENERAL
    Benutzer:
    Details: Reload iCal Web Calendar Veranstaltung in Hamburg (1): Triggered by 1368556950 - 1368469032 = 87918 > 86400
    Funktion: CalendarImport::importCalendarWithID()
    IP-Adresse: 66.249.78.8
    Browser: SAMSUNG-SGH-E250/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0 (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)

    ID: 4378
    Datum: 14.5.2013 18:42
    Ursprung: Frontend
    Kategorie: GENERAL
    Benutzer:
    Details: reading cal
    Funktion: CalendarImport importFromICS()
    IP-Adresse: 66.249.78.8
    Browser: SAMSUNG-SGH-E250/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0 (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)

    Warum wird an dieser Stelle eigentlich ein Import ausgelöst?

  9. #9
    Contao-Fan Avatar von hschottm
    Registriert seit
    15.06.2009.
    Ort
    Loxstedt, Germany
    Beiträge
    825
    User beschenken
    Wunschliste

    Standard

    Hi Erdpferd,

    dass die beiden Einträge zusammen stehen liegt nur daran, dass sie in der gleichen Methode direkt hintereinander ausgegeben werden. Den einen kann ich eigentlich mal rausnehmen, ich denke, das habe ich nur vergessen.
    Der Re-Import wird also nur ein Mal, wie es sein soll, aufgerufen.
    Ich weiß jetzt leider nicht, welchen Kalender du als ICS-Webkalender importierst. Ich hoffe nicht, dass du den importiert hast und dann die einzelnen Beiträge nachbearbeitet hast, dann solltest du das nämlich nicht über den Webkalender machen. Nach festgelegter Dauer wird dieser nämlich immer wieder automatisch von Contao neu importiert. Das ist für Kalender gedacht, die keiner weiteren Nachbearbeitung bedürfen und die von einer externen Datenquelle (Webkalender) angefüttert werden.

    An der Stelle (z.B. Bot) passiert das deswegen, weil die Importroutine sich in den Contao getAllEvents Hook einhängt und der im Prinzip bei jedem Seitenaufruf von Contao, ob nun durch einen Nutzer oder einen Bot, aufgerufen wird. Nach festgelegter Dauer (bei dir 86400 Sekunden = 1 Tag) wird automatisch wieder der Import dieses Kalenders aufgerufen.

    Sollte der Webkalender "Veranstaltung in Hamburg (1)" falsch importiert worden sein, wäre es klasse, wenn du mir an meine private Email evtl. mal den Kalender oder falls der Link öffentlich ist, den Link schicken könntest, damit ich das mal ausprobiere.

    Gruß,
    Helmut

    Zitat Zitat von Erdpferd Beitrag anzeigen
    Hallo,

    ich klinke mich hier mal rein, da ich ein sehr dringendes Problem habe, dass mir dem oberen sehr ähnlich scheint. Ich verwende Contao 3.0.6 und calendar_ical 3.0.0

    Wenn sich ein Bot bei mir anfragt, dann sind die einzelnen Events zwar noch da, aber neu angelegt und ohne Inhalte. Zudem wird der Titel des Events um den Seitentitel erweitert.

    Im Log landen folgende Einträge:

    ID: 4377
    Datum: 14.5.2013 18:42
    Ursprung: Frontend
    Kategorie: GENERAL
    Benutzer:
    Details: Reload iCal Web Calendar Veranstaltung in Hamburg (1): Triggered by 1368556950 - 1368469032 = 87918 > 86400
    Funktion: CalendarImport::importCalendarWithID()
    IP-Adresse: 66.249.78.8
    Browser: SAMSUNG-SGH-E250/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0 (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)

    ID: 4378
    Datum: 14.5.2013 18:42
    Ursprung: Frontend
    Kategorie: GENERAL
    Benutzer:
    Details: reading cal
    Funktion: CalendarImport importFromICS()
    IP-Adresse: 66.249.78.8
    Browser: SAMSUNG-SGH-E250/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0 (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)

    Warum wird an dieser Stelle eigentlich ein Import ausgelöst?
    Blackmail's such an ugly word. I prefer extortion -- the "x" makes it sound cool.
    -- Bender

  10. #10
    Contao-Nutzer
    Registriert seit
    28.01.2011.
    Beiträge
    113

    Standard

    Hallo Helmut,

    vielen Dank für die Antwort. Ich habe den Kalender überhaupt nicht importiert. Der Gedanke ist, dass die Events weiterhin gepflegt werden, der Kalender wird also bearbeitet, und auf der Seite und im Newsletter eine ICS-Datei stehen, die es ermöglichen die neuen Events direkt mit in den Kalender zu übernehmen. Mir scheint aber gerade, dass ich an der Erweiterung etwas falsch verstanden habe. Der optimale Fall wäre, wenn nur das jeweilige als ICS Verfügbar wäre und so in die eigenen Kalender übernommen werden kann.

    Verstehe ich es dann richtig, dass der Re-Import die Events löscht, da es ja im Grunde keine Quelle gibt aus der Importiert wurde? Die Importquelle wäre eine csv oder ics-Datei aus dem Dateimanager, oder? Müsste das immer der ganze Kalender sein, oder ließe sich so ein Kalender auch erweitern?

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •