Hoher Speicherverbrauch

Alice

Erfahrenes Mitglied
Hallo. :)

Ich habe zum testen meines Skriptes an wichtigen Stellen folgendes eingebaut:
PHP:
echo memory_get_usage().'<br />';

Ich komme aktuell auf ein Maximum von etwa 20 MB. Jedoch wird das Skript realistisch schon mehr verbrauchen wenn es komplett fertig ist.

Was mich aber an der ganzen Sache wundert ist der Startwert. Denn das Skript startet schon mit einem Speicherverbrauch von 11-12 MB.

Wie ist das möglich?
 
Hi,

der PHP-Interpreter braucht von Haus aus schonmal natürlich Arbeitsspeicher, wie bei jedem anderen Programm halt auch.

Grüße,
BK
 
Hi,

kann gut sein, meiner Erfahrung nach ist PHP nicht gerade sparsam mit dem Arbeitsspeicher...

// Edit: Also bei mir braucht PHP "nur" 600 KiB.
PHP:
<?php
$usage = memory_get_usage();

echo $usage .' B<br />';
echo ($usage/1024) .' KiB<br />';

?>

// Edit-2: Und via htop zeigt mir mein Server eine RAM-Auslastung von 11 MiB an.

Grüße,
BK
 
Zuletzt bearbeitet:
Startwert ist relativ:

- Es könnte in der php.ini ein Eintrag für "auto_prepend_file" eingetragen sein, der ausgeführt wird, bevor dein eigentliches PHP-Script ausgeführt wird. In dem auto_prepend_file steht normaler PHP-Code, der natürlich auch Resourcen belegt. Bei dir ist vermutlich kein auto_prepend_file eingetragen - möglich wäre es jedoch.

- Hoher Speicherverbrauch lässt auf die Menge geladenener Extension rückschließen.

- Ebenfalls macht es einen Unterschied, mit welcher SAPI PHP gestartet wird. PHP an der Konsole hat einen anderen Speicherverbrauch wie PHP als Modul im Webserver.

- Nicht zuletzt ist die PHP-Version selbst für den Verbrauch ein Kriterium. Es gibt mit der einen oder anderen Version unterschiedliche Zend-Engines. Die eine ZE hat einen Garbage-Collector (und verbraucht damit natürlich mehr) die andere Version hat ein paar Optimierungen im Unterbau.
 
Hallo.

Ich habe mir das noch einmal angeschaut.

Ein leere PHP-Datei mit folgendem Inhalt:
PHP:
<?php echo memory_get_usage(); ?>
braucht 104224 Bytes.

Mein Skript benötigt wahrscheinlich mehr weil es selber durch include eingebunden wird. Vorher wird auch eine große PHP-Datei von meiner Forensoftware geladen.

Main_Skript.php
-> include global.php
-> include mein_skript.php

Ist schon krass das dann schon 11-12 MB verbraucht werden.
 
Dem kann man entgegen wirken. PHP räumt den Speicher erst implizit beim Beenden des Scriptlaufs auf. Wenn du zur Laufzeit im Script sehr viele Schleifen hast, in denen Resourcen angefordert werden, und diese Resourcen nicht explizit mittels unset() oder den zugehörigen free()-Methoden frei gibst, passiert das natürlich erst nachdem alles abgearbeitet wurde.

Häufig werden diese Fehler bei MySQL-Abfragen begangen. Sorge einfach dafür, das mit mysql_free_result() alles brav aufgeräumt wird. Viele Extensions bieten eine clear()- oder free()-Methode an. Nutze diese Möglichkeiten. Das wirkt sich direkt auf das Laufzeitverhalten aus.
 
Zurück