mempry_limit ?
hawkmaster
- php
0 dedlfix
Hallo zusammen,
in einem PHP Script lese ich ein Verzeichnis ein. In diesem Verzeichnis können Dateien hineinkopiert werden die ich dann anzeigen will.
Zusätzlich benötige ich noch eine Information die in der Datei steht.
Ich mache dies wie folgt:
echo" <select>";
$handle = opendir($ordner);
while ($entry = readdir($handle)){
if($entry != "." && $entry != "..") {
$fh = fopen("$ordner/$entry", "r") ;
$pages = fread($fh, filesize("$ordner/$entry"));
if ( preg_match("/Info: ([0-9]+)/",$info,$parts)) {
echo "<option value=\"$parts[1]\">$parts[1]</option>\n";
}
fclose($fh) or die("Datei nicht gefunden");
closedir($handle);
echo" </select>";
Ich hatte nun ein Problem mit einer großen Datei. Es gab einen "memory_limit" Fehler. Memory_Limit war vorher 16MB.
Ich habe es nun auf 64M erhöht.
Zum testen hatte ich vor dem Select und nach dem Select mit
echo memory_get_usage() . "<br>";
gearbeitet.
Bei einer Datei die 1414482 Bytes gross ist, zeigt die Ausgabe vorher
1571664 Bytes an und am Ende des Scripts 2986488.
Also fast das doppelte.
Liegt das daran, dass die Datei zweimal im Speicher liegt?
Einmal bei "opendir()" und dann noch bei "fopen()" ?
Welcher maximale Wert ist empfehlenswert für
"memory_limit" ?
vielen Dank und viele Grüße
hawk
echo $begrüßung;
$fh = fopen("$ordner/$entry", "r") ;
$pages = fread($fh, filesize("$ordner/$entry"));
Um einen kompletten Dateiinhalt einzulesen, kann man file_get_contents() verwenden. Wenn der Suchwert am Anfang zu finden ist, wäre eine Begrenzung auf den zu erwartenden Bereich sinnvoller als ein komplettes Einlesen.
Du ignorierst die Möglichkeit, dass die Datei zwar vorhanden ist, aber nicht gelesen werden kann. In solch einem Fehlerfall fährst du einfach fort, was dann zu Folgefehlern führt.
if ( preg_match("/Info: ([0-9]+)/",$info,$parts)) {
Wie kommt man nun von $pages auf $info?
Bei einer Datei die 1414482 Bytes gross ist, zeigt die Ausgabe vorher
1571664 Bytes an und am Ende des Scripts 2986488.
Also fast das doppelte.
Wie das? Wenn ich die Differenz zwischen den beiden Werten bilde komme ich auf ein wenig mehr als die Dateigröße.
Liegt das daran, dass die Datei zweimal im Speicher liegt?
Einmal bei "opendir()" und dann noch bei "fopen()" ?
opendir() interessiert sich nicht für den Dateiinhalt.
Welcher maximale Wert ist empfehlenswert für "memory_limit" ?
Der Maximalwert ist 0 für unlimitiert und empfehlenswert, wenn man sich den Speicher nicht mit anderen teilen muss. Ansonsten ist eine Begrenzung in Multiuserumgebungen sinnvoll, damit nicht einzelne Scripte andere lahmlegen. Eine wissenschaftliche Begründung für den optimalen Wert wird dir keiner liefern können. Hier hilft sicher nur, deine Umgebung genau einzuschätzen und Erfahrungswerte zu sammeln.
echo "$verabschiedung $name";
Hallo dedlfix,
danke dir für deine Hilfe
if ( preg_match("/Info: ([0-9]+)/",$info,$parts)) {
Wie kommt man nun von $pages auf $info?
das war natürlich falsch gepostet. sorry, es muss richtig heissen:
if ( preg_match("/Info: ([0-9]+)/",$pages,$parts)) {
so sthet es auch im Script.
Bei einer Datei die 1414482 Bytes gross ist, zeigt die Ausgabe vorher
1571664 Bytes an und am Ende des Scripts 2986488.
Also fast das doppelte.Wie das? Wenn ich die Differenz zwischen den beiden Werten bilde komme ich auf ein wenig mehr als die Dateigröße.
ich weiss es leider auch nicht warum hier so ein großer Wert angezeigt wird.
vielen Dank und viele Grüße
hawk
ich weiss es leider auch nicht warum hier so ein großer Wert angezeigt wird.
Das sind bei der Dateigrösse von ca. 1,35MB ein Overhead von ziemlich genau 153,5kB
Wo siehst du da einen grossen Wert?
Hallo
Das sind bei der Dateigrösse von ca. 1,35MB ein Overhead von ziemlich genau 153,5kB
Wo siehst du da einen grossen Wert?
also entweder bin ich ganz verkehrt ....
vor dem Opendir() also am Anfang wird für die verwendete Datei mit 1,4MB der Wert 1,57 MB angezeigt.
Am Scriptende zeigt echo memory_get_usage() . "<br>";
aber
2,98 MB ( 2986488) an
vielen Dank und viele Grüße
hawk
echo $begrüßung;
vor dem Opendir() also am Anfang wird für die verwendete Datei mit 1,4MB der Wert 1,57 MB angezeigt.
Was vor dem opendir() los ist, wissen wir nicht. Das was du hier präsentierst lässt nicht auf "verwendete Datei" schließen. Außerdem müssen wir annehmen, dass du, auch wenn die Schleife die Bearbeitung mehrere Dateien erlaubt, nur eine Datei im Verzeichnis liegen hast, denn du sprichst immer nur von einer. Wenn du also vor dem opendir() einen Speicherverbrauch X misst, dann eine Datei öffnest und Y misst, dann ist Y minus X der Verbrauch durch das Öffnen. Alles andere können wir nicht sehen.
echo "$verabschiedung $name";