Code optimieren

ronaldo84

Erfahrenes Mitglied
Hallo.

Ich habe eine Datenbank. In dieser stehen 15.000 Produkteinträge . Nun habe ich eine Menge von ca. 70.000 Html -Seiten. Auf diesen Seiten sind Produktbezeichnungen für die Produkte in der Datenbank. Die überflüssigen Seiten sind leer. Nun öffne ich mittels meines Skripts jede dieser Html Seiten und durchsuche Sie nach jeder Artikelnummer aus meiner Datenbank. Ist die Artikelnummer vorhanden soll bei dem Datensatz bei dem die Artikelnummer gefunden wurde eine Artid eingetragen werden. Nun habe ich folgendes Skript:
PHP:
<?php
$sql = "Select artnr, artid FROM preisliste_win WHERE artid = '0'"; //artikelnummer aus Tabelle holen
$verbindung= mysql_connect("localhost", "name", "passwort");
mysql_select_db("root", $verbindung) or die(mysql_error());
$res = mysql_query($sql) or die(mysql_error());
for ( $filecounter=57001; $filecounter <= 58500; ++$filecounter) //For-Schleife die die Dateien hochzählt bis <=60580
{ 
$sourcefile = "?action=artmehr&artid=$filecounter" ; 
$content = file($sourcefile); //Zeilen werden eingelesen
mysql_select_db("root", $verbindung) or die(mysql_error());
$res = mysql_query($sql) or die(mysql_error());
 
	while ($row = mysql_fetch_object($res)) //solange Objekt in res
	 { 
	 for ($i=0; $i<count($content); $i++) //For-Schleife die jede einzelen Zeile nach der artikelnummer durchsucht
	 { 
 
 
		if(ereg($row->artnr, $content[$i],$regs)==strlen($row->artnr)) 
		{ mysql_query("Update preisliste_win SET artid= '$filecounter WHERE artnr= '$row->artnr'") or die (mysql_error());
		 $updatecounter++; echo $filecounter; echo "<br>"; }		 
		else
		{break;}
	 }
	 }
}
echo "Updates: "; echo $updatecounter;
?>
Nun dauert das je einige Zeit. Ich kann nicht alle 70.000 Dateien auf einmal durchsuchen, da sonst eine Zeitüberschreitung von 1200 Sekunden vorkokmmt und das Skript beendet wird. Bis jetzt ist es nur möglich ca. 1500 bis 2000 Dateien mit einem Durchgang zu durchsuchen.Danach muss ich dem Filecounter einen neuen Bereich zuteilen. Weiß jemand wie ich den Vorgang beschleunigen kann? Habe versucht das SQL-Statement schon einzuschränken indem er nur die DS nimmt bei denen Artid = 0 ist. Würde mich freuen wenn mir jemand helfen könte.
 
Naja... wenn du die Dateien per file_get_contents() einliest, brauchst du nicht jede Zeile einzeln durchgehen... das dürfte schneller sein.

Was ich aber nicht verstehe....
Code:
$sourcefile = "?action=artmehr&artid=$filecounter"
...das sind doch niemals statische HTML-Dateien....die Daten müssen doch irgendwo her kommen :confused:
 
Ups. Hast recht. Da is mir beim Copy & Paste anscheinend was verlorengegangen. Habe den Link jetzt grade nicht zur Hand weil ich jetzt an einem anderem Rechner sitze. Aber normalerweise ist das eine komplette URL. Die Seiten unterscheiden sich nur am Ende.Dort steht dann halt eine Zahl zwischen 0 und 70.000. Diese simuliere ich mit dem $Filecounter.
 
Zuletzt bearbeitet:
Hi!

Übergib die Variable $filecounter doch mal per URL

script.php?filecounter=0&filecounterende=70000&duchlaufe=1500

Setz dann die Variable in die Schleife ein
Dann muß noch getestet werden ob das Counterende schon erreicht ist.

Am Ende des Scriptes wir wieder eine Seite aufgerufen in der dann die NEUE $filecounter verwendet wird.

Ist schlecht zu erklären.
Im Prinzip ruft sich das Script immer selber auf und die Suchbereiche werden per URL übergeben
(
script.php?filecounter=1500&filecounterende=70000&duchlaufe=1500
script.php?filecounter=3000&filecounterende=70000&duchlaufe=1500
script.php?filecounter=4500&filecounterende=70000&duchlaufe=1500


Bei Bedarf schreib ich dir schnell wie ich es meine.

MfG
 
Danke. WEnn ich das Skript rekursiv aufrufe wird es zwar nicht wirklich schneller, dadurch umgehe ich aber das Timeout nach 1200 sekunden. Danke werde es gleich mal ausprobieren. WEnn ich hilf brauche sag ich dir bescheid.
 
Sorry. Das klappt so doch nicht. Habe das Skript nun so gemacht:
PHP:
<?php
$filecounter=$_GET['filecounter'];
$updatecounter=$_GET['updatecounter'];
if ($filecounter<= 40000) 
{$filecounter= 40500;}
$counter= $filecounter+1800;
$sql = "Select artnr, artid FROM preisliste_win WHERE artid = '0'"; 
$verbindung= mysql_connect("localhost", "name", "password");
mysql_select_db("name", $verbindung) or die(mysql_error());
$res = mysql_query($sql) or die(mysql_error());
for ( $filecounter; $filecounter <= $counter; ++$filecounter) 
{ 
$sourcefile = "http://web/dateien/shop.htm?action=artmehr&artid=$filecounter" ; 
$content = file_get_contents($sourcefile); //Zeilen werden eingelesen
	mysql_select_db("name", $verbindung) or die(mysql_error());
	$res = mysql_query($sql) or die(mysql_error());
 
	while ($row = mysql_fetch_object($res))	 { 
		if(ereg($row->artnr, $content,$regs)==strlen($row->artnr)) 
		{ mysql_query("Update preisliste_win SET artid= '$filecounter' WHERE artnr= '$row->artnr'") or die (mysql_error());
		 $updatecounter++;}		 
		else
		{}
	 }
}
if ($filecounter <= 70000)
{header("Location:http://web/daten/testzwecke/versuch.php4?filecounter=$filecounter&updatecounter=$updatecounter"); }
else
{
echo "Updates: "; echo $updatecounter;
}
?>

Leider kommt dann immernoch die Meldung über das Timeout nach 1200 Sekunden. Kann ich das irgendwie umgehen? Den Filecounter setzte ich auf 40500 weil anscheinend ab dort erst die Dateien beginnen.
 
Hi ronaldo84

Kannst Du eventuell mal ein paar von den Artikelseiten posten?

Wenn ich das Richtig verstehe ist jeder Artikel nur einmal in der DB.
Kann es auch sein das die Artikelbeschreibung öfters vorkommt (Seite xxx & Seite yyyy) oder ist die Artikelnummer nur einmal auf der Homepage vertreten?

Geht das Script wenn Du anstatt er 1800 nur 18 setzt?

Ich glaube es liegt daran das du 1800 mal die DB aufruft.

MfG
 
Klar kann ich. hier sind erstmal drei:
Seite 1
Seite 2
Seite 3
Habe jetzt drei wilkürliche genommen. Man erkent ja am Link das sich eigentlich nur die Artid ändert. Leider sind zwischen den Artikeln auch Seiten ohne Inhalt.Du kannst das Prüfen indem du einfach am ende des Links die artid änderst.

Das Skript an sich geht ja. Halt nur bei der Menge von Dateien die ich Aufrufe und durchsuche dauert es einfach zu lange. Es klappt auch mit 1800 Seiten. Aber sobla ich z.B. 5000 Seiten mit einem durchgang durchsuchen will wird das Skript nach 1200 Sekunden beendet.
 
Ist der Safe-Mode aktiviert? Ansonsten könntest du mittels set_time_limit(0) die Ausführungszeit des Scripts auf unendlich setzen.

Wenn das nicht geht, musst du es "rekursiv" machen, nur anstatt der oben beschriebenen Headermodifikation die Weiterleitung per JavaScript machen. Dadurch wird nämlich tatsächlich ein neuer HTTP-Request geschickt, welcher bewirkt, dass die Ausführungszeit des Scripts wieder von 0 beginnt.
 
Auch wenn man mit
PHP:
header("Location:irgendwas.php");
arbeitet wird ein neuer Request geschickt.
Der Header geht ja erst an den Browser und dieser fragt dann nach irgendwas.php.
 
Zurück