2012-10-12 5 views
20

In PHP habe ich oft Probleme mit dem Speicherlimit. Gerade bei hochintegrierten Systemen Ressourcen wie Drupal etc.Je mehr desto besser für PHP memory_limit?

Was will ich hier wissen ist:

  • Ist es gut, wie 2GB sehr hohe PHP-Speicherlimit zu haben?
  • Gibt es einen großen Nachteil?

Edited:

Als Szenario, zum Beispiel in Drupal, es braucht so viel Speicher, während wir Cache leeren via Web Panel (nicht durch Drush oder einem Skript). Also selbst für nur diesen Fall, ich brauche definitiv High-Limit um 512MB derzeit.

+4

In einem Wort, NEIN. Ihr Speicherlimit sollte so niedrig wie möglich innerhalb der Grenzen dessen festgelegt werden, was Sie benötigen. Das Speicherlimit wird auf jedes einzelne Skript angewendet, das gleichzeitig ausgeführt wird, nicht global. Wenn Sie die Einstellung niedrig einstellen, wird sichergestellt, dass bei Fehlern, die z. eine Endlosschleife, wird das Skript früh getötet, anstatt außer Kontrolle zu geraten und den gesamten Server zum Stillstand zu bringen. – DaveRandom

+1

Wie viel Speicher benötigen Sie für 100 gleichzeitige Anfragen? 200GB? – JvdBerg

+5

@JvdBerg Das Speicherlimit definiert nicht, wie viel Speicher _actually_ verwendet wird. Es ist nur die Grenze, die ein einzelner Prozess verwenden darf. – KingCrunch

Antwort

27

Die goldene Regel: geben Sie nur PHP, was PHP braucht, um zu arbeiten, und nichts mehr.

Diese Situationen zu vermeiden, wenn Ihr System unnötig auf dem PHP-Prozess verstopft, und Sie wird auch bei der Suche nach Bugs helfen (Ein Skript, das 1 GB Arbeitsspeicher nimmt, ist ungewöhnlich, und eine Grenze von Speichern 2 GB geben wird darüber hinwegtäuschen, dass) .


Für Ausnahmefälle, in denen Sie eine einzelne Skriptdatei sehr schwer Speicher wissen, können Sie ini_set() verwenden, um die Speichergrenze Richtlinie zur Laufzeit zu ändern. Siehe this und this.

+0

'BEARBEITET MEINE FRAGE BITTE.' So oh Gott !!! Jetzt verlangsamt sich mein System wegen dieser Grenze ??? (nur zum Löschen des Cache-Prozesses anscheinend) @ _ @ –

+1

@ 4lvin: Bearbeitete meine Antwort. –

+0

Vielen Dank. Sie haben sogar ZWEI Probleme gelöst;) –

0

Wenn Sie Skripte haben, die Sie wissen große Mengen an Speicher benötigen, ist es vollkommen sicher und benötigt, um das Limit hoch zu setzen. Probleme können auftreten, wenn das Limit für das System in Bezug auf die verfügbare Speichermenge und andere laufende Anwendungen auf "Hoch" gesetzt ist.

Denken Sie auch daran, dass ein fehlerhaftes Skript, das in einer Endlosschleife enden könnte, oft ziemlich schnell zum Stillstand kommt, wenn das Speicherlimit 64 MB oder etwas ähnliches beträgt. Wenn das Speicherlimit in diesem Szenario bei 4 GB liegt, würde ein System länger in voller Länge in einer Endlosschleife laufen, was dazu führen könnte, dass Ihr gesamtes System nicht mehr reagiert.

Aber ich hatte große Datenverarbeitung Anwendungen mit Speicherlimits von etwa 2-4 GB ohne Probleme auf Systemen mit 4-8 GB Speicher. Beachten Sie, dass diese Anwendungen, wie von anderen Benutzern angegeben, EINE Instanz waren. Wenn Sie Anwendungen haben, die mehrere Instanzen Ihrer Skripte ausführen (wie bei den meisten Web-Anwendungen), werden Sie große Probleme haben, wenn Sie in jedem Fall viel Speicher verwenden. Sie werden nicht mehr genügend Arbeitsspeicher haben und weitere Clients können Ihre Anwendung erst verwenden, wenn der Arbeitsspeicher freigegeben wurde.

Aber erhöhen Sie nicht nur das Speicherlimit, um Probleme zu verbergen. Überprüfen Sie, warum Ihre Anwendung so viel Arbeitsspeicher benötigt, und prüfen Sie, ob Sie dies zuerst beheben können.

5

Nein, je mehr ist nicht besser. Es ist die Menge an Speicher eine einzige Skript darf konsumieren. Wenn Ihr Server beispielsweise 4 GB Arbeitsspeicher enthält, können nur zwei Skripts gleichzeitig den gesamten Arbeitsspeicher belegen.

Im Allgemeinen sollten PHP-Skripte wenig Speicher verwenden. Normalerweise wird der gesamte Speicher, den ein Skript reserviert hat, freigegeben, wenn es beendet wird, aber Sie können Speicher zuvor explizit bereinigen, indem Sie Variablen, die während der Ausführung nicht mehr benötigt werden, explizit löschen. Auf diese Weise können Sie Ihr Skript effizienter machen.

+0

'unset()' wird normalerweise nicht benötigt, solange Sie nicht globale Variablen verwenden. – KingCrunch

+0

@KingCrunch Auch das sollte keinen Unterschied machen, sollte es sein? 'global' ist immer noch nur innerhalb der Grenzen der Skriptausführung global, sie bleiben nicht zwischen Anfragen bestehen. Beachten Sie auch, dass 'unset()' nicht garantiert, dass der Speicher sofort freigegeben wird, Sie müssten 'gc_collect_cycles()' auch aufrufen – DaveRandom

+0

'BEARBEITET MEINE FRAGE BITTE.' So oh Gott !!! Jetzt verlangsamt sich mein System wegen dieser Grenze ??? (nur zum Löschen des Cache-Prozesses scheinbar) @ _ @ –

Verwandte Themen