Aus Excel exportierte Daten mit Bestandsdaten vergleichen und Änderungen übernehmen

südpol

Erfahrenes Mitglied
Hi,

ich stehe gerade vor einem Problem. Ich habe ein Tool geschrieben welches Daten aus einem Excel file extrahiert (phpexcel), mit den bereits vorhandenen Daten in der DB vergleicht und ggf. Änderungen übernimmt. Das funktionert bei kleinen Excel Files auch ohne Probleme - sobald ich jedoch Dateien verwende die 3000+ Datensätze enthalten, bleibt die Anwendung scheinbar einfach stehen (keine Fehlermeldung).

Der Ablauf meines Tools ist derzeit wie folgt:
- Upload der Excel Datei und konvertieren in Objekte (speichern in einem array)
- Einlesen aller derzeit in der DB vorhandenen Daten in Objekte (speichern in einem array)
- Durchlaufen der upload Objekte und Vergleich mit den Bestandsdaten (Änderungen werden ggf. übernommen und das Objekt wird als zu ändern markiert, nicht vorhandene Objekte werden neu angelegt)
- Durchlaufen des arrays und speichern der änderungen bzw. neu Anlegen von neuen Objekten.

Hat jemand eine Idee wie ich das schlanker/einfacher bauen kann?

(Code hochladen geht leider nicht - alleine der hier besprochene Teil hat 3000+ Zeilen code und eine lauffähige Variante wäre wohl am 20.000+ Bereich...)

Bin für gute Tipps dankbar.
 
Ich würde erstmal damit anfangen, das Bottle-Neck zu identifizieren. Das kannst du auf zweierlei Arten erreichen:

1. Professionellere Variante: Profiler
2. Verwende an markanten Stellen microtime()

Was ist dir lieber?
 
Du musst zuerst herausfinden, woran es nun genau hapert. Ein PHP-Skript bleibt nicht "eifnach stehen", d.h. es wird irgendeinen Fehler/eine beschränkung geben.

Gibst du alle fehler mittle error_reporting(E_ALL) aus? Ist die Einstellung display_errors = true gesetzt?
Wahrscheinlich ist, dass das Skript entweder am max_execution_time-Limit oder am max_post_size-Limit scheitert, dies sagt dir die Fehlermedung dann aber auch.
 
Hi,

danke für die schnelle Antworten.

Das mit den markanten Stellen habe ich schon versucht - habe auch eine extra logger Klasse - das blöde ist, dass ich darin nur noch sehe, dass ein query ausgeführt wird (der direkt auf der DB durch läuft) und danach ist aus.

Error_reporting etc ist auf E_ALL eingestellt, max_execution_time habe ich auf 160 hoch geschraubt das max_post_size-Limit steht auf mehr als ausreichenden 150M.

Einen Profiler habe ich bis jetzt nicht eingesetzt. Kannst du einen guten empfehlen?
 
Du müsstest das Ganze aber auf jedenfall mal auf eine bestimmte Stelle im Skript eingrezen können. Oder funktioniren garkeine Ausgaben mehr?
 
Hi,

das habe ich zwischenzeitlich - schlau werde ich daraus aber nicht:

PHP:
ogger(" Method: ".__METHOD__." 002",$query,LOG_LEVEL_DEBUG);
		$recordSet  = $GLOBALS['adodb']->Execute($query);
		logger(" Method: ".__METHOD__."", "Query Executed",LOG_LEVEL_DEBUG);
		if (!$recordSet) ErrorReport("Class:".__CLASS__." Method: ".__METHOD__." ", $GLOBALS['adodb']->ErrorMsg().$query, true);
		$this->List = array();
		while($res = $recordSet->FetchNextObject()) {
			logger(" Method: ".__METHOD__."", "AppID: ".$res->ID,LOG_LEVEL_DEBUG);

Die erste logger funktion schreibt mir den query wie es sich gehört in mein Log. Der Query läuft auch auf der DB durch. Der zweite call des loggers wird aber nicht ausgeführt - damit scheint der die Execute methode von ADODB bei der Ausführung des Query zu scheitern (oder in ein timeout zu laufen). Damit muss ich wohl einen besseren Weg finden die Vergleichsdaten zu laden...
 
Ist es denn immer die gleiche Stelle? Oder variiert die Anzahl der ausgeführten Queries? Welche ADODB-Schnittstelle verwendest du genau?
 
Hi,

hängt immer an der gleichen Stelle - ich verwende ADODB mit dem oci connector zu einer Oracle 11g Datenbank.
 
Dann noch eine Frage - du hast es bestimmt selbst schon geprüft aber - gibt es einen Eintrag bei "ErrorReporting"? Was auch immer das macht - vermutlich Fehlerlogging. Ich will nur ausschließen, dass an den falschen Stellen nach der Ursache gesucht wird.

Bisher sieht es danach aus, als wäre es ein SQL-Problem.

Anderer Ansatz: Wieviel Arbeit würde es machen bzw. lohnt es sich, mal PDO/OCI zu probieren: http://de2.php.net/manual/en/ref.pdo-oci.php

Derweil studiere ich mal die ADODB-Manuals
 
Hi,

richtig - error reporting ist eine error handler. Der würde sowohl ins log schreiben wie auch (in der Entwicklungsversion) den Fehler im Browser ausgeben.

Den DBAL zu ändern wäre recht komplex - gerade Oracle ist der extrem wählerisch. Zudem habe ich einzelne Teile meiner Anwendung, die auf oracle und MSSQL zugreifen müssen und die Anwendung soll grundsätzlich portierbar sein...
 
Zurück