Hallo,
ich sitze vor einem Problem und weiß nicht, wie rum ich es am besten lösen könnte. Oder ob ich ganz am gesuchten Baum vorbeigetrottet bin.
Gewünschtes Vorhaben:
- Ein Autohaus mit allen gängigen Marken will jeden Sonntag einen Newsletter an Abonnenten versenden.
- Der Newsletter soll die Fahrzeuge beinhalten, die innerhalb der letzten Woche hinzugekommen sind.
- Es gibt zwei Arten von Abonnenten: Kategorie 1 bekommt alle neuen Fahrzeuge. Kategorie 2 bekommt nur neue Fahrzeuge der Marken, die abonniert wurden (es können n Marken gewählt werden).
Mein eigentliches Problem besteht nun in der Dimension der ganzen Geschichte und in der Tatsache, dass das ganze über einen Cron-Job gelöst werden muss. Jede Woche kommen knapp über 100 neue Fahrzeuge hinzu. Die Anzahl der Abonnenten liegt bei mehreren Tausend.
Ich habe mir überlegt, zuerst den Newsletter für die Abonnenten-Kategorie 1 zu versenden, da er für alle gleich ist und ich ihn somit als Blindkopie in einem Zug versenden könnte.
Aber bei der Kategorie 2 ist das problematischer. Der Newsletter an sich muss ja für jeden Abonnenten neu erzeugt und versendet werden. Das würde bedeuten:
1. Einen Abonnenten aus der Datenbank holen
2. Fahrzeuge aus der Datenbank holen, die den Kriterien des Abonnenten entsprechen
3. Newsletter generieren
4. Newsletter versenden
5. Betroffenen Abonnenten als erledigt markieren
Bei 3.000 Abonnenten müsste sich das Skript also 3.000 Mal aufrufen. Ich bezweifle, dass der Server das freudig mitmacht. (Mir steht leider keine Möglichkeit zur Verfügung, das "kurz mal" zu testen.)
Da ich noch nie sonderlich viel mit Cron-Jobs gemacht habe, stelle ich mir auch folgende Frage (alles PHP, "so nebenbei" erwähnt): Angenommen, der Cron-Job ruft jeden Sonntag um 02:00 Uhr das Newsletter-Bastel-Skript auf. Das Skript markiert nun alle Abonnenten als unerledigt, holt sich einen Abonnenten, bastelt den Newsletter, verschckt ihn, markiert den Abonnenten als erledigt und ruft sich nun selbst wieder auf (ohne anschließend wieder alle Abonnenten als unerledigt zu markieren). Wie realisiere ich denn den erneuten Aufruf? Die URL werde ich wohl nicht aufrufen können, also so, wie der Cron-Job das Skript aufruft? Z. B. dann mit exec() o. ä.?
Möglichkeit zwei wäre, das Skript nur einmal laufen zu lassen, dann jedoch in einer Schleife. Nur frage ich mich, ob sowas wirklich "akzeptabel" ist. Dafür müsste ich den Skript-Timeout auf 30 Minuten oder noch höher stellen. Und das hat doch auch seine negativen Folgen, wenn sich ein anderes Skript "aufhängt" bzw. in einer Dauerschleife während anderer Entwicklungstests endet.
Mir gefallen irgendwie beide Lösungen überhaupt nicht. Nur weiß ich leider nicht, wie man es anders - oder anders gesagt besser - lösen kann. Ich stehe hier absolut auf dem Schlauch. Hat jemand also irgendwelche Erfahrungen mit ähnlichen Fällen gesammelt oder sieht vielleicht sofort eine bessere Lösung?
Meine bisherigen Massen-Newsletter-Lösungen sehen so aus, dass sich ein Skript in einem IFrame für jeden Abonnenten neu aufruft und dann die Individualisierung und den Versend vornimmt. So umgehe ich eine hohe Serverlast und das ganze kann Stunden dauern, ohne dass es den Skript-Timeout interessiert. Doch bei einem Cron-Job habe ich keinen Browser, in dem ich irgendwelche clientseitigen IFrames und JS-Reloads einbinden kann. Ich habe auch keine Möglichkeit, in den Ablauf einzugreifen oder ihn sonst wie zu beeinflussen, wenn er erstmal gestartet wurde.
Vielen Dank,
pb
(Und nein, ich kann mich leider nicht kürzer fassen. Meine große Schwäche *G*.)
ich sitze vor einem Problem und weiß nicht, wie rum ich es am besten lösen könnte. Oder ob ich ganz am gesuchten Baum vorbeigetrottet bin.
Gewünschtes Vorhaben:
- Ein Autohaus mit allen gängigen Marken will jeden Sonntag einen Newsletter an Abonnenten versenden.
- Der Newsletter soll die Fahrzeuge beinhalten, die innerhalb der letzten Woche hinzugekommen sind.
- Es gibt zwei Arten von Abonnenten: Kategorie 1 bekommt alle neuen Fahrzeuge. Kategorie 2 bekommt nur neue Fahrzeuge der Marken, die abonniert wurden (es können n Marken gewählt werden).
Mein eigentliches Problem besteht nun in der Dimension der ganzen Geschichte und in der Tatsache, dass das ganze über einen Cron-Job gelöst werden muss. Jede Woche kommen knapp über 100 neue Fahrzeuge hinzu. Die Anzahl der Abonnenten liegt bei mehreren Tausend.
Ich habe mir überlegt, zuerst den Newsletter für die Abonnenten-Kategorie 1 zu versenden, da er für alle gleich ist und ich ihn somit als Blindkopie in einem Zug versenden könnte.
Aber bei der Kategorie 2 ist das problematischer. Der Newsletter an sich muss ja für jeden Abonnenten neu erzeugt und versendet werden. Das würde bedeuten:
1. Einen Abonnenten aus der Datenbank holen
2. Fahrzeuge aus der Datenbank holen, die den Kriterien des Abonnenten entsprechen
3. Newsletter generieren
4. Newsletter versenden
5. Betroffenen Abonnenten als erledigt markieren
Bei 3.000 Abonnenten müsste sich das Skript also 3.000 Mal aufrufen. Ich bezweifle, dass der Server das freudig mitmacht. (Mir steht leider keine Möglichkeit zur Verfügung, das "kurz mal" zu testen.)
Da ich noch nie sonderlich viel mit Cron-Jobs gemacht habe, stelle ich mir auch folgende Frage (alles PHP, "so nebenbei" erwähnt): Angenommen, der Cron-Job ruft jeden Sonntag um 02:00 Uhr das Newsletter-Bastel-Skript auf. Das Skript markiert nun alle Abonnenten als unerledigt, holt sich einen Abonnenten, bastelt den Newsletter, verschckt ihn, markiert den Abonnenten als erledigt und ruft sich nun selbst wieder auf (ohne anschließend wieder alle Abonnenten als unerledigt zu markieren). Wie realisiere ich denn den erneuten Aufruf? Die URL werde ich wohl nicht aufrufen können, also so, wie der Cron-Job das Skript aufruft? Z. B. dann mit exec() o. ä.?
Möglichkeit zwei wäre, das Skript nur einmal laufen zu lassen, dann jedoch in einer Schleife. Nur frage ich mich, ob sowas wirklich "akzeptabel" ist. Dafür müsste ich den Skript-Timeout auf 30 Minuten oder noch höher stellen. Und das hat doch auch seine negativen Folgen, wenn sich ein anderes Skript "aufhängt" bzw. in einer Dauerschleife während anderer Entwicklungstests endet.
Mir gefallen irgendwie beide Lösungen überhaupt nicht. Nur weiß ich leider nicht, wie man es anders - oder anders gesagt besser - lösen kann. Ich stehe hier absolut auf dem Schlauch. Hat jemand also irgendwelche Erfahrungen mit ähnlichen Fällen gesammelt oder sieht vielleicht sofort eine bessere Lösung?
Meine bisherigen Massen-Newsletter-Lösungen sehen so aus, dass sich ein Skript in einem IFrame für jeden Abonnenten neu aufruft und dann die Individualisierung und den Versend vornimmt. So umgehe ich eine hohe Serverlast und das ganze kann Stunden dauern, ohne dass es den Skript-Timeout interessiert. Doch bei einem Cron-Job habe ich keinen Browser, in dem ich irgendwelche clientseitigen IFrames und JS-Reloads einbinden kann. Ich habe auch keine Möglichkeit, in den Ablauf einzugreifen oder ihn sonst wie zu beeinflussen, wenn er erstmal gestartet wurde.
Vielen Dank,
pb
(Und nein, ich kann mich leider nicht kürzer fassen. Meine große Schwäche *G*.)
Kommentar