Mailinglisten-Archive |
Hi Ulf.. also, ich hatte mal ein ca. 21 millionen zeichen enthaltenes Logfile. ich habe dies zeilenweise auslesen lassen und nach 500 zeichen ab in die datenbank. dann hat das script wieder an der stellen angefangen an der es aufgehört hat und weitere 500 zeilen ausgelesen etc. mehr als ca. 3 durchlaeufe waren aber nicht drin, dann ist es abgestürzt. ich habe immer schön alles variablen unsettet etc. aber es klappte nicht. jezt soll ein script ein verzeichnis öffnen, dies auslesen und nach- einander die enthaltenen files öffnen, auslesen in einen string packen und dann in ein neues file in einem anderen verzeichnis schreiben. klappt auch wunderbar. jedoch schafft dieses script nur ca. 6 files auszulesen und neu zu schreiben, bis es abstürzt. auch hier habe ich immer alle variablen unsettet. die textfiles, die ausgelesen werden sind auch nur ca. 5kb groß, also nicht zu groß eigentlich. oder kann ein string das nicht mehr auffassen? Ulf Wendel wrote: > Dies ist nicht möglich. PHP bietet keinen Zugriff auf die > Speicherverwaltung. Mit unset() kann jedoch der von einer Variable > belegte Speicher zur erneuten Nutzung durch den Interpreter freigegeben > werden. Das OS profitiert hiervon jedoch nur indirekt, da möglicherweise > weniger zusätzlicher Speicher alloziiert wird. hmm, laeuft hier auf nem wxmp (win98, xitami, mysql, php3.11) aber wie gesagt, ich habe ja auch jede relevante variable nach einer schleife unsettet. > > Falls es zufällig genau dreißig Sekunden sind, wirst Du an der > Laufzeitbegrenzung scheitern (php3.ini -> time_limit und > set_time_limit()). > ne, so lange hält es nicht durch. nach ca. 4-7 sekunden ist sense :( > Ob es am Speicherverbrauch liegt oder nicht siehst Du an den > Systemanzeigen. Bitte prüfe ob wirklich der Speicherverbrauch dich > killt. > > Setze überall im Skript Statusmeldungen wie echo "fopen mit Datei > $datei"; (und denke an die sofortige Ausgabe mit flush()), und versuche > mal den Fehler einzukreisen. hast du mal ein beispiel wie flush() arbeitet? habe das heute nacht auch schon probiert, aber sehe keinen sinn darin, da ich eigentlich keine bildschirmausgabe brauche. es wäre nur schön, wenn man <html> UND </html> sehen könnte, denn dann wüsste ich, dass das script durchgelaufen ist. aber soweit kommt es nicht. flush() ist doch nur dafür da, daß alles an den browser übergeben wird, schon bevor das script fertig ist, oder? > > Wofür, was ist das Ziel? Obiges ist eine undeutliche > Aufgabenbeschreibung. sorry, kannst du jetzt nach obigem text nachvollziehen was ich bezwecken möchte? o.k., eigentlich schreibe ich ja nicht gerne solche langen mails in dieser liste, aber hier der quellcode: <html><body> <?php $verzeichnis=opendir('C:\\WiNDOWS\\Desktop\\dir'); //verzeichnis auf if(!$verzeichnis) {echo "fehler aufgetreten";} else { $i=0; while ($file = readdir($verzeichnis)) //Inhalt auslesen { $file_array[$i] = $file; //filenamen in array $i++; } closedir($verzeichnis); //verzeichnis schliessen echo "Files im Verzeichnis: $i <br>\n"; for ($j = 3; $j <= $i; $j++) //ab drittem file auslesen { $read_host="C:\\WiNDOWS\\Desktop\\dir\\$file_array[$j]"; $read_file = fopen($read_host, "r"); if(!$read_file) {echo "fehler aufgetreten";} else { echo "File $j -> $file_array[$j] geöffnet --> "; while(!feof($read_file)) { $read_line=fgets($read_file,1024); $text .= $read_line; } fclose($read_file); unset ($read_file); $write_host="C:\\WiNDOWS\\Desktop\\dir\\test\\$file_array[$j]"; $write_file = fopen($write_host, "w"); if (!$write_file) { echo "fehler aufgetreten"; } else { fwrite($write_file, $text); fclose($write_file); echo " $file_array[$j] geschlossen<br>\n"; unset ($text); unset ($write_file);unset ($line); } } } } ?> </body></html> -------- ich habe hier jetzt alles unnötige rausgenommen, aber nach ca. 100 von ca. 1000 files ist schluss. das letzt (ca. 100ste) file wird noch geöffnet, teilweise geschrieben und dann ist schluss. any idea? CPUlast ist 100% speicher ebenfalls, aber nur für ca. 3 sekunden.
php::bar PHP Wiki - Listenarchive