2014-07-09 11 views
5

Wenn der PHP-Prozess startet, lädt er Erweiterungen, verschiedene Konfigurationsdirektiven und erstellt globale/env-Variablen und solche, die (ich nehme an) Speicherplatz verbraucht.PHP-CLI - wie man die für den Start erforderliche Speicherauslastung reduziert PHP-Prozess

Was ich tun möchte, ist ein einfaches PHP-Skript, das den geringsten Speicherbedarf für eine bestimmte Aufgabe verwendet, bootstrap.

Ein Beispiel CLI Skript wie:

printf("\nHello World"); 

Der obige Code beruht nicht auf irgendwelchen $ _ENV Variablen oder bestimmte PHP-Streams, die standardmäßig geöffnet sind, die, wenn sie nicht vorhanden wäre - würde PHP-Prozess benötigt weniger Speicher.

Was würden Sie tun, um die Speichernutzung auf ein Minimum zu reduzieren, um den oben beschriebenen Code auszuführen?

Antwort

1

Für ein paar Bytes zu gewinnen, könnten Sie Ihren PHP-Code einfach in einer sauberen Umgebung laufen:

env -i php -r 'var_dump(memory_get_peak_usage()); var_dump($GLOBALS);' 

Die env -i starten das Skript in einer sauberen Umgebung. Sie können den Unterschied sehen, indem Sie die $GLOBALS dumping. Die Funktion memory_get_peak_usage() zeigt den maximal belegten Speicher für das Skript an. Aber auf meinem System erhalte ich mit dieser Methode nur ein paar KB. Es hängt von Ihren Umgebungsvariablen ab.

Für eine echte Optimierung des Speicherbedarfs müssen Sie in Ihre verwendeten Erweiterungen suchen. Um Ihre Nebenpfad zu erhalten, führen Sie einfach ein Skript wie folgt aus:

php -r 'var_dump(ini_get("extension_dir"));' 

Sie wahrscheinlich einige Erweiterungen wie diese finden:

curl.so 
gd.so 
json.so 
[...] 

Dies sind die Erweiterungen, die Sie dynamisch mit dl laden kann(). Sie kommen nicht in Ihren Speicherverbrauch. Aber wenn man so will jede Erweiterung um zu sehen, durch das System geladen, können Sie den folgenden Befehl verwenden:

php -m 

diese Listen vergleichen, werden Sie feststellen, es gibt viel mehr Erweiterung zur Verfügung. Diese sind in PHP kompiliert. Um einen geringeren Speicherbedarf zu haben, müssten Sie PHP aus der Quelle kompilieren.

Um PHP zu optimieren, müssen Sie in Ihren Code schauen, welche Erweiterungen Sie benötigen. Die richtigen Optionen für ./configure zu erhalten ist eine zeitraubende Aufgabe. Für den Anfang finden http://www.php.net/manual/de/configure.about.php

Normalerweise, wenn Sie eine bestimmte Erweiterung benötigen, können Sie mit der PHP-Handbuch und werfen Sie einen Blick in den Installationsabschnitt für die Verlängerung gehen würde, für zlib, wäre dies zum Beispiel http://php.net/manual/de/zlib.installation.php

Für Ihr spezifisches Beispiel sollten Sie versuchen, PHP aus der Quelle ohne Optionen zu kompilieren und zu testen, ob es Ihren Anforderungen entspricht.

+0

Vielen Dank für die Antwort, aber das ist nicht, was ich suche. Selbst wenn keine Erweiterungen geladen oder kompiliert werden, wird das Ausführen des Skripts, das ich gepostet habe, aufgrund des Bootstrapping-Prozesses, den PHP durchläuft, ziemlich viel Speicher in Anspruch nehmen. Was ich mich wundere, sind Dinge wie die Verwendung von 'get_defined_vars()' und das Deaktivieren von ihnen, so dass die interne Symboltabelle freigegeben wird, offene Streams erhält und sie usw. schließt. – user2601913

+0

Ich fürchte, dass die Sache, die Sie im Sinn haben, keine Unterschiede machen wird. Im Vergleich zu den Modulen sollte der Unterschied in der Speichernutzung gering sein. Wenn du es dir genauer ansehen möchtest, benutze "php -r 'sleep (1000)", benutze "ps" um die PID zu erhalten und benutze dann Tools wie "lsof" und "pmap". – Trendfischer

+0

Das ist, worum diese Frage geht, um herauszufinden, was andere Leute über die Speichernutzung wissen, wenn sie den PHP-Prozess starten. Ich habe die Speicherbelegung bereits mit valgrind gemessen und Erweiterungen/Code erkannt, die am häufigsten Speicher verwenden. Ich möchte alles bis auf das letzte Byte abschneiden (ich weiß, dass das nicht möglich ist, aber wir Programmierer versuchen es immer). Das Beispiel, das ich mit 'get_defined_vars()' bereitgestellt habe, war nur ein Hinweis darauf, was ich gerne tun würde. Wenn Sie neben der Entfernung der Erweiterung noch etwas wissen, lassen Sie es mich wissen. – user2601913

0

Sie könnten versuchen mit -n "No php.ini Datei wird verwendet werden", die verhindert, dass PHP Standard-Erweiterungen geladen werden.

Sie können dann dl() in Ihren Skripten verwenden, z. dl('json.so') um alle zur Laufzeit benötigten Erweiterungen zu laden.

Sie müssen auch date_default_timezone_set() verwenden, um eine Warnung zu vermeiden.

Verwandte Themen