Mailinglisten-Archive |
Hallo, ich stehe vor einem Problem: Ich muß in einer großen Textdatei (~2,2 MB, 20.000 Zeilen) mit PHP eine Zeile finden und verändern. Jede Zeile beginnt mit einem eindeutigen Passwort, welches es zu finden gilt, anschließend wird verglichen ob die Zeile sich verändert hat, wenn ja, neu geschrieben, da sie leider länger ist als die alte, wird der Rest der Datei dann vorher gesichert und anschließend ebenfalls geschrieben. Es folgt der verwendete Code: $fp = fopen($datei, "r+")) $gefunden = 0; // Filepointer direkt vor die korrespondierende Tresorzeile setzen while(($buffer = fgets($fp, 4096)) && ($gefunden == 0)) { if(substr($buffer, 0, 8) == $pwd) { $alte_zeile = $buffer; $stelle = ftell($fp); $laenge = strlen($buffer); $stelle = $stelle - $laenge; fseek($fp, $stelle); $gefunden = 1; } // if } // for // Vergleich ob sich die Zeile geändert hat if($alte_zeile != $neue_zeile) { // folgende Zeilen sichern $i = 0; while($buffer = fgets($fp, 4096)) { $cache[$i] = $buffer; $i++; } // Filepointer zurücksetzen fseek($fp, $stelle); // Tresorzeile in cache einfügen $cache[0] = $treffer_zeile; // Datei neu schreiben $anz_zeilen = count($cache); for($i=0; $i<$anz_zeilen; $i++) { fputs($fp, $cache[$i]); } } Das Skript läuft auf meinem Server und bei Strato perfekt, Dauer 0,4 Sekunden (mit microtime()) getestet. Auf dem Server auf dem es aber laufen soll braucht es 20! Sekunden, auch wenn die Grundlast des Servers gering ist (mitten in der Nacht). Habe ich irgendeine Performance-Bremse eingebaut oder geht das nicht schneller (das blöde System mit der Textdatei muß so bleiben, die Verantwortlichen können sich so schnell nicht entscheiden, auf ne Datenbank umzustellen, auf dem Server fliegen noch etliche solche Textdateibasierte Konstruktionen rum. Vielen Dank für eure Mühe Raul
php::bar PHP Wiki - Listenarchive