Ich habe einen php / mysql-Scraper erstellt, der gut läuft und keine Ahnung hat, wie man ihn am effizientesten als Cron-Job ausführen kann.
Es gibt 300 Seiten mit jeweils 20 - 200 Seiten. Es dauert zwischen 4 - 7 Stunden, um alle Seiten abzukratzen (abhängig von der Netzwerklatenz und anderen Faktoren). Der Schaber muss einmal täglich komplett ausgeführt werden.
Soll ich dies als 1 Cron-Job ausführen, der für die gesamten 4 - 7 Stunden läuft, oder ihn jede Stunde 7 Mal ausführen, oder ihn alle 10 Minuten ausführen, bis er fertig ist?
Das Skript ist so eingerichtet, dass es wie folgt vom Cron ausgeführt wird:
%Vor%Dies wird die Funktion do_srape () ausführen, die 10 URLs gleichzeitig löscht, bis (in diesem Fall) 600 Sekunden vergangen sind. Das Ausführen von do_scrape kann zwischen 5 - 60 Sekunden dauern.
Ich frage hier, da ich im Web keine Informationen darüber finden kann, wie ich das ausführen soll, und ich bin vorsichtig genug, um das täglich am Laufen zu halten, da php nicht wirklich darauf ausgelegt ist, für 7 Stunden als einzelnes Skript ausgeführt zu werden / p>
Ich habe es in Vanilla PHP / mysql geschrieben, und es läuft auf dem Cut-down-Debian-VPS, nur mit lighttpd / mysql / php5 installiert. Ich habe es mit einem Timeout von 6000 Sekunden (100 Minuten) ohne irgendein Problem ausgeführt (der Server fiel nicht um).
Jeder Rat, wie Sie diese Aufgabe übernehmen können, wird geschätzt. Was sollte ich aufpassen? oder mache ich das alles falsch?
Danke!
Es ist nichts falsch daran, ein gut geschriebenes PHP-Skript über längere Zeit laufen zu lassen. Ich habe einige Skripte, die buchstäblich seit Monaten ununterbrochen laufen. Beobachten Sie einfach Ihre Speichernutzung, und Sie sollten in Ordnung sein.
Das heißt, Ihre Architektur ist ziemlich einfach und skaliert wahrscheinlich sehr gut.
Sie könnten erwägen, von einer großen monolithischen Schrift zu einer Strategie des Teilens und Herrschens überzugehen. Zum Beispiel klingt es wie Ihr Skript macht synchrone Anfragen für jede URL ist Scrapes. Wenn das wahr ist, dann wird die meiste Zeit dieser 7-Stunden-Laufzeit untätig auf eine Antwort von einem entfernten Server gewartet.
In einer idealen Welt würden Sie diese Art von PHP nicht schreiben. Eine Sprache, die Threads behandelt und leicht asynchrone http-Anfragen mit Callback ausführen kann, wäre viel besser geeignet.
Das heißt, wenn ich das in PHP machen würde, würde ich versuchen, ein Skript zu haben, das N Kinder, die Daten von URLs schnappen, annimmt und die Antwortdaten in eine Art Arbeitswarteschlange und dann ein anderes Skript steckt das läuft die ganze Zeit und verarbeitet jede Arbeit, die es in der Warteschlange findet.
Dann cron Sie einfach Ihren fetcher-script-manager, um einmal pro Stunde zu laufen, es verwaltet einige Worker-Prozesse, die die Daten holen (in parellel, damit die Latenz Sie nicht umbringt), und kleben Sie die Arbeit in die Warteschlange. Dann sieht der Queue-Cruncher die Arbeit in der Warteschlange und knirscht sie.
Je nachdem, wie Sie die Warteschlange implementieren, kann dies ziemlich gut skalieren. Sie könnten mehrere Felder haben, um entfernte Daten zu holen und sie in eine zentrale Warteschlangenbox zu stecken (mit einer Warteschlange, die in mysql, oder memcache oder was auch immer implementiert ist). Sie könnten sogar mehrere Boxen haben, die Arbeit aus der Warteschlange nehmen und die Arbeit erledigen.
Natürlich steckt der Teufel in den Details, aber dieser Entwurf ist im Allgemeinen besser skalierbar und in der Regel robuster als ein Skript zum Wiederholen von Fetch-Prozessen mit einem Thread.
Sie sollten kein Problem haben, es einmal am Tag auszuführen. So würde ich es machen. Timeouts sind ein großes Problem, wenn PHP über einen Webserver bereitgestellt wird, aber da Sie direkt über die PHP-Programmdatei interpretieren, ist dies in Ordnung. Ich würde Ihnen raten, Python oder etwas anderes zu verwenden, das eher aufgabenfreundlich ist.