TOMahawk85
Erfahrenes Mitglied
Hallo,
Ich arbeite bei einem kleinen Onlineversandhändler, der (noch) ohne Warenwirtschaftsystem agiert. Um uns die Arbeit trotzdem zu erleichten, bin ich dabei eine Art WWS Light per PHP zu programmieren. Das soll Warenbestände (also Ware ist oder ist nicht verfügbar) aus den Bestandslisten unserer Lieferanten in eine SQL-Datenbank eintragen, damit wir damit arbeiten können. Im moment läuft noch alles über EXCEL-Listen, was sehr unschön zum Arbeiten ist.
Zum eigentlichen Problem:
Um die Bestände in die Datenbank einzutragen, muss logischerweise die Artikelnummer der Lieferantenliste (CSV-Format) mit der in unserer Datenbank verglichen und der zugehörige Warenbestand übernommen werden.
Das zu programmieren war nicht das Problem. Für "kleine" Listen mit um die 10.000 Zeilen funktioniert das auch. Werden die Listen aber deutlich länger (und die Dauer der Verarbeitung steigt ja exponentiell), kommt es irgendwann zu folgender Fehlermeldung:
"Service Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
Additionally, a 503 Service Unavailable error was encountered while trying to use an ErrorDocument to handle the request."
Das will ich natürlich vermeiden. Deswegen meine Frage:
Wie kann/muss ich folgenden Quellcode optimieren, damit auch größere Listen problemlos abgearbeitet werden?
Erledigt werden soll das am Ende übrigens per "shell_exec", was auch bereits funktioniert, aber zum selben Problem führt.
Über zusätzliche Optimierungsvorschläge wäre ich natürlich nicht undankbar.
"max_execution_time" ist übrigens ein ganzer Tag.
Und hier noch die Funktion "searchForId":
Alle anderen eingebauten Funktionen sind für das Geschwindigkeitsproblem praktisch nicht relevant und somit auch nicht angegeben.
Ich hoffe mir kann hierbei geholfen werden und bedanke mich schonmal im Vorraus für die Hilfe.
Mit freundlichen Grüßen,
TOMahawk85
Ich arbeite bei einem kleinen Onlineversandhändler, der (noch) ohne Warenwirtschaftsystem agiert. Um uns die Arbeit trotzdem zu erleichten, bin ich dabei eine Art WWS Light per PHP zu programmieren. Das soll Warenbestände (also Ware ist oder ist nicht verfügbar) aus den Bestandslisten unserer Lieferanten in eine SQL-Datenbank eintragen, damit wir damit arbeiten können. Im moment läuft noch alles über EXCEL-Listen, was sehr unschön zum Arbeiten ist.
Zum eigentlichen Problem:
Um die Bestände in die Datenbank einzutragen, muss logischerweise die Artikelnummer der Lieferantenliste (CSV-Format) mit der in unserer Datenbank verglichen und der zugehörige Warenbestand übernommen werden.
Das zu programmieren war nicht das Problem. Für "kleine" Listen mit um die 10.000 Zeilen funktioniert das auch. Werden die Listen aber deutlich länger (und die Dauer der Verarbeitung steigt ja exponentiell), kommt es irgendwann zu folgender Fehlermeldung:
"Service Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
Additionally, a 503 Service Unavailable error was encountered while trying to use an ErrorDocument to handle the request."
Das will ich natürlich vermeiden. Deswegen meine Frage:
Wie kann/muss ich folgenden Quellcode optimieren, damit auch größere Listen problemlos abgearbeitet werden?
Erledigt werden soll das am Ende übrigens per "shell_exec", was auch bereits funktioniert, aber zum selben Problem führt.
Über zusätzliche Optimierungsvorschläge wäre ich natürlich nicht undankbar.
"max_execution_time" ist übrigens ein ganzer Tag.
PHP:
uploadFile('temp/', $_FILES['fileUpload']["name"], 'fileUpload'); //Upload Lieferantenliste
$supplierNameIntern = $_POST['selectImport']; //Interner Name der Lieferanten
// Auslesen aller relevanten Daten des ausgewählten Lieferanten
$supplier = readDatabase('SELECT * FROM admin_suppliers WHERE supplier_name_intern="'.$supplierNameIntern.'"');
$targetNumber = $supplier['supplier_row_manufacturer_number'];
$rowQuantity = $supplier['supplier_row_quantity'];
$targetRow = $supplier['supplier_number_type'];
$supplierName = $supplier['supplier_name'];
$valueInStock = explode(";", $supplier['supplier_value_in_stock']);
$valueLimitedStock = explode(";", $supplier['supplier_value_limited_stock']);
$valueNotInStock = explode(";", $supplier['supplier_value_not_in_stock']);
// Daten der Lieferantenliste und der Datenbank in Array packen
$array = readCsv('temp/',$_FILES['fileUpload']["name"], ';', true);
$sqlArray = readDatabase("SELECT * FROM admin_list_content WHERE supplier='".$supplierName."'");
// Tabellentitel für "REPLACE"-Query auslesen
$tableNames = readDatabase('SHOW COLUMNS FROM admin_list_content');
foreach($tableNames as $title){ $columns .= $title['Field'].', '; }
$columns = substr($columns,0,-2);
// Lieferantenliste-Array mit Datenbank-Array vergleichen
$n=0;
foreach($sqlArray as $var){
// Suche nach "Zeile"/2. Ebene im Array
$key = searchForId($var['supplier_number'], $targetNumber, $array);
$supplierQuantity = $array[$key][$rowQuantity];
// Werte "Lieferbar", "Begrenzt lieferbar", "Nicht lieferbar" oder, falls nicht anders bei Lieferant angegeben, konkreter Warenbestand
switch(true){
case (in_array($supplierQuantity,$valueInStock)): $quantity = 100;
break;
case (in_array($supplierQuantity,$valueLimitedStock)): $quantity = 1;
break;
case (in_array($supplierQuantity,$valueNotInStock)): $quantity = 0;
break;
default: $quantity = $supplierQuantity;
}
// Erstellung des Query pro Datenbankzeile
foreach($var as $value){
$content .= "'".$value."', ";
}
editDatabase('REPLACE INTO admin_list_content ('.$columns.') VALUES ("'.implode('","', $sqlArray[$n]).'");');
$n++;
unset($content);
}
Und hier noch die Funktion "searchForId":
PHP:
function searchForId($id, $fieldName, $array) {
foreach ($array as $key => $val) {
if ($val[$fieldName] === $id) {
return $key;
}
}
return null;
}
Alle anderen eingebauten Funktionen sind für das Geschwindigkeitsproblem praktisch nicht relevant und somit auch nicht angegeben.
Ich hoffe mir kann hierbei geholfen werden und bedanke mich schonmal im Vorraus für die Hilfe.
Mit freundlichen Grüßen,
TOMahawk85