![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 |
|
Erfahrener Benutzer
Registriert seit: 04.03.2007
Ort: Viernheim
Beiträge: 130
|
Hallo sehr geehrte DG Gemeinde,
vor langem hatte ich hier meine Probleme mit dem Crawler schon beschrieben, und jetzt hab ich einen Perfomance problem. Habe mit meinem Script 1.300 Links gecrawlt. Beim ersten versuch klappte nichts, ich musste den max_execution_time auf 6666 Sekunden setzen, damit ich eine Sicherheit habe, dass es vollständig crawlt. Danach lief das Script 36 Minuten. Das dauerte mir zu lange *g. Mein nächster Versuch über CLI brachte schon bessere Ergebnisse. Dort brauchte es 19 Minuten für 1.300 Links.. Da das Script später täglich mehr als 1 Millionen Links crawlen soll, ist es schon etwas nervig wenn es so lange braucht. Ich gehe in meinem Crawler-Script so vor:
PHP-Code:
Ein kleiner Hinweis, da da Script vorher über nen Browser lief, ist da noch meine "Refresh-Script" drin Geändert von Eyüp (14.03.2008 um 09:14 Uhr). Grund: Refresh-Script auskommentiert |
|
|
|
|
|
Nach oben #3 |
|
Erfahrener Benutzer
Registriert seit: 04.03.2007
Ort: Viernheim
Beiträge: 130
|
So, hab jetzt ein wenig gegooglt und das hier rausgefunden:
http://de.php.net/manual/de/ref.curl.php#59877 cURL kann bis zu 50% schneller sein als file_get_contents. Ich werd heute versuchen, meinen Code in cURL umzuschreiben... |
|
|
|
|
|
Nach oben #4 |
|
BIN EIN KRASSA HELD!!!111
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.188
|
Lass das Script lokal mit einem Debugger (beispielsweise xdebug) laufen, aktiviere den Profiler und schau dir die Verteilung der Rechenzeit an. Dann siehst du erstmal wo du optimieren kannst und was am meisten Rechenzeit braucht, wenn es beispielsweise das file_get_contents ist, ist dafür eben auch mit die Antwortzeit + Geschwindigkeit des Servers gegenüber verantwortlich und die DL-Geschwindigkeit.
Übrigends würde ich die Ergebnisse escapen (mysql_(real_)escape_string bevor du den Kram in die Datenbank einfügst. |
|
|
|
|
|
Nach oben #5 |
|
Erfahrener Benutzer
Registriert seit: 04.03.2007
Ort: Viernheim
Beiträge: 130
|
Danke Benjamin, dann muss ich mir zunächst anschauen, wie das mit dem XDebug und dem Profiler geht *g
Laut der php.net Kommentaren ist ja cURL trotzdem schneller als file_get_contents, oder etwa nicht? Escaping ist immer drin *g nur würde man es hier nicht mehr richtig lesen können... |
|
|
|
|
|
Nach oben #6 |
|
Erfahrener Benutzer
Registriert seit: 04.03.2007
Ort: Viernheim
Beiträge: 130
|
So, hab das in cURL umgeschrieben. Die Geschwindigkeit ist gleich geblieben.
Jetzt werde ich nach Anleitung von der Nutzung von XDebug & Profiler suchen und dies anwenden Wenn ihr noch Tipps habt, her damit Evtl, kann man die RegEx durch was anderem ergänzen oder die foreach Schleife ersetzen? kA |
|
|
|
|
|
Nach oben #7 | |
|
BIN EIN KRASSA HELD!!!111
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.188
|
Zitat:
Ich würde mir lokal nen Xampp installieren, dazu xdebug dann die config von php anpassen, dass der profiler von xdebug mitläuft und dir irgendwo seine profiles speichert von den scriptdurchläufen und dann kannst du dir die mit: http://sourceforge.net/projects/wincachegrind/ (unter windows) anschauen. Das sieht dann so in der Art aus: Klick für größere Ansicht und das kannst du dann auswerten nachdem du siehst welche funktionen am meisten aufgerufen werden, wie lange sie brauchen etc und kannst damit die langsamen Teile identifizieren. Vielleicht sind ja auch einfach die Server die du abfragst so langsam, dass sie entweder verdammt lange bruachen um die Anfrage zu beantworten oder dass sie ihre daten maximal mit XX kb/s schicken ... heißt den Teil bekommst du überhaupt nicht schneller, da hilft es dann irgendwann nur noch das script so zu bauen, dass problemlos mehrere Instanzen synchron laufen können und die sich die Arbeit teilen (da müsste dann allerdings das Design der ganzen Applikation nochmal überdacht werden.) Es wäre ja beispielsweise auch möglich, aber da musst du eben mal rumtesten ob das über den gesamten zeitverbrauhc überhaupt relevant ist, die inserts zu "sammeln" sprich du brauchst ja eigentlich den INSERT ( INSERT INTO table (spalte1, spalte2, spalte 3) VALUES ) nur einmal und dann in der form erweitert: ( wert1, wert2, wert3), ..... ( wertX.1, wertX.2, wertX.3); sprich am ende ein großes Query abschicken, damit hast du halt nen viel größeren Speicherverbrauch, aber eben nicht andauernd einen insert, der overhead der querys wird dadurch kleiner. |
|
|
|
|
|
|
Nach oben #8 |
|
Erfahrener Benutzer
Registriert seit: 04.03.2007
Ort: Viernheim
Beiträge: 130
|
Danke Benjamien,
derzeit läuft jetzt der Crawler nochmal die Links etc. durch Hier vorab der Code mit cURL: PHP-Code:
![]() Zum Redesign des Scriptes, dazu hätt ich ein paar fragen.. So, laut WinCacheGrind verbraucht curl_exec die meiste Zeit.. und das ist Serverseitig da kann man wohl wenig machen *g danach kommt preg_match und mysql_query.. Zum Redesign des Scriptes, wie meinst du das genau, dass es synchron ablaufen soll.. ich will ja täglcih mehrere tausend links crawlen Geändert von Eyüp (15.03.2008 um 08:16 Uhr). |
|
|
|
|
|
Nach oben #9 |
|
BIN EIN KRASSA HELD!!!111
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.188
|
1) Versuch die von mir angesprochene Änderung betreffs dem INSERT zu machen und beispielsweise immer 100 Inserts zusammen zu machen (das einzelne Query darf aber nicht zu groß werden)
2) Überleg dir wie mehrere Instanzen synchron laufen könnten, sprich mehrere Startpunkte oder ein System was sich seine Startpunkte selbst sucht oder sowas 3) mal noch schauen ob vielleicht Snoopy noch nen tick schneller ist als Curl ( http://snoopy.sourceforge.net/ ) Oder trenne die Scripte, eins das sich nur ums downloaden kümmert, den code in einem verzeichnis speichert und ein weiteres Script, dass sich nur um das Parsen der Dateien kümmert, alles dinge die du ausprobieren kannst. |
|
|
|
|
|
Nach oben #10 |
|
Erfahrener Benutzer
Registriert seit: 04.03.2007
Ort: Viernheim
Beiträge: 130
|
zu 1) Nun, da die INSERTs eh klein sind, würd sich das evtl. nicht lohnen... aber ich werds auf jedenfall probieren. vllt. bringts ja doch was
zu 2) Nunja, soviele Startpunkte gibts ja nicht. Ich werd jetzt das System ein wenig erweitern, weil das hier war spezifisch nur für einen Bereich und nur für eine Seite.. zu 3) Ich werds jetzt probieren Es geht wie es schient nicht schneller. Hab jetzt eine andere Seite ausprobiert, und da war der Crawler doppelt so schnell fertig. statt 0,7 Seiten pro Sekunde hat er 1,7 Seiten pro Sekunde gecrawlt. |
|
|
|
|
|
Nach oben #12 |
|
Erfahrener Benutzer
Registriert seit: 04.03.2007
Ort: Viernheim
Beiträge: 130
|
Nun, ganz einfach
Ich werde demnächst C++ lernen und den Code dann in C++ neu schreiben mit mehr Features Zu blöd das PHP kein Multithreading untersützt... |
|
|
|
|
|
Nach oben #13 |
|
Neuer Benutzer
Registriert seit: 15.03.2008
Beiträge: 2
|
Ja, so dachte ich früher auch. Ich hab mir damals sogar eine CronJob-Simulation und einen IRC-Bot in PHP geschrieben. Heute lasse ich die Finger von solchen Aktionen und insbesondere von PHP selbst.
Darf ich fragen, für was du den Crawler schreibst? |
|
|
|
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| PHP 5.2 Kompilierung schlägt fehl | Byrel | Tools, Server, Betriebssysteme | 0 | 03.11.2006 21:09 |
| [Rezension] PHP 5 Kochbuch | Artemis | Literatur | 2 | 07.09.2006 19:15 |
| PHP 5.1.5, PHP 4.4.4 und PHP 5.2.0 RC2 veröffentlicht | Ben | Nachrichten | 2 | 01.09.2006 16:05 |
| PHP 5.1 ist drausen | robo47 | Nachrichten | 5 | 28.11.2005 20:30 |
| Neue PHP "release candidates": PHP 4.4.2 RC 1 und PHP 5.1 RC 6 | ||||