2017-02-27 4 views
0

Ich versuche, eine Website Überwachung von Webapp mit PHP erstellen. Momentan nutze ich curl, um Header von verschiedenen Websites zu sammeln und eine MySQL-Datenbank zu aktualisieren, wenn sich der Status einer Website ändert (z. B. wenn eine Seite, die "oben" war, "nach unten" geht).Scaling Curl mit PHP und Cron

Ich benutze curl_multi (über die Rolling Curl X Klasse, die ich leicht angepasst habe), 20 Seiten parallel zu verarbeiten (was die schnellsten Ergebnisse zu geben scheint) und CURLOPT_NOBODY, um sicherzustellen, dass nur Header gesammelt und ich es versucht habe um das Skript zu rationalisieren, um es so schnell wie möglich zu machen.

Es funktioniert OK und ich kann 40 Seiten in ca. 2-4 Sekunden. Mein Plan war es, das Skript jede Minute über Cron laufen zu lassen ... also sieht es so aus, als ob ich in der Lage sein werde, ungefähr 600 Webseiten pro Minute zu bearbeiten. Obwohl dies in der Minute gut ist, wird es auf lange Sicht nicht ausreichen.

Also, wie kann ich das skalieren? Ist es möglich, mehrere Crons parallel zu betreiben, oder kommt es zu Engpässen?

Von meinem Kopf dachte ich, dass ich vielleicht die Datenbank in Gruppen von 400 brechen und ein separates Skript für diese Gruppen (z. B. IDs 1-400, 401-800, 801-1200 usw. ausführen könnte) separate Skripte), so dass keine Gefahr einer Beschädigung der Datenbank besteht. Auf diese Weise würde jedes Skript innerhalb einer Minute fertig sein.

Es fühlt sich jedoch so an, als würde dies nicht funktionieren, da das eine Skript, das curl_multi ausführt, die maximale Leistung bei 20 parallelen Anfragen scheint. Wird das funktionieren oder gibt es einen besseren Ansatz?

Antwort

0

Ja, die einfache Lösung ist die Verwendung des gleichen PHP CLI-Skripts und die Übergabe der Argumente 1 und 2, d. H. Zeigt den minimalen und maximalen Bereich zur Verarbeitung des Datenbankdatensatzes an.

Ex. crontab Liste
* * * * * php /user/script.php 1 400
* * * * * php /user/script.php 401 800

Oder ein einziges Skript verwenden, können Sie Multi-Threading auslösen (Multi-Threading in PHP mit Pthreads). Das Cron-Intervall sollte jedoch auf dem Benchmark der Fertigstellung von 800 Standorten basieren.

Ref: How can one use multi threading in PHP applications

Ex. Das Skript Multithread wird in 3 Minuten abgeschlossen dann geben Sie das Intervall als */3.

+0

Danke - das ist eine große Hilfe. Ich glaube nicht, dass ich pthreads verwenden kann, weil "die pthreads-Erweiterung in einer Webserver-Umgebung nicht verwendet werden kann" und dies auf einem Webserver ist. – Ryan