Frage

Ich bin Portierung eine große Web-Anwendung auf einer gemeinsamen Web-Hosting-Umgebung. Die App wurde in PHP geschrieben 4. Die neue Umgebung hat PHP 5.2.

Aus irgendeinem Grund wird die Anwendung enorme Mengen an Speicher undicht, wenn in PHP 5.2 ausgeführt wird. Ich kann buchstäblich Speichernutzung geht durch das Dach mit memory_get_usage () sehen, bis sie die Grenze von 64 MB erreicht (die in einer gemeinsamen Umgebung ist sehr großzügig, verwendet die Seite mit 12 oder 16 MB auf PHP 4 laufen).

Ich vermute, dass dies ein Nebeneffekt von etwas, das in PHP 5, höchstwahrscheinlich die Handhabung von Objektreferenzen in Argumenten geändert hat. Doch die Suche nach dem besonderen Verhalten (n), dass Ursache (n) das Leck extrem schwierig ist, da die Anwendung sehr komplex ist, und teilweise nicht sehr gut geschrieben (ja, es ist von mir).

Wie die App auf einem gemeinsam genutzten Webspace installiert ist, kann ich nicht das klassische Debugging verwenden (soweit ich weiß). Ich würde sehr, sehr ähnlich wie die Umwelt vor Ort neu zu erstellen zu vermeiden, da ich an dem Projekt buchstäblich den ganzen Tag für einige Zeit arbeite.

Also meine Fragen sind:

  • Weiß jemand, typische PHP4 => 5 Übergang Tücken, vor allem, wenn sie mit großen Mengen von Objekten zu tun, dass die Ursache für mein Leck (s)

  • könnte sein,
  • kennt jemand eine Art von Debugger-unabhängig, Skript-only „grafischen Rahmen dump“ Werkzeug für die Variablen von PHP verwendet, die mir helfen könnten finden, welche Variablen sind diese enormen Mengen an Speicher auffressen?

War es hilfreich?

Lösung

Um dieses Problem zu lösen, würde ich:

  1. Profil das Skript mit xdebug + WinCacheGrind (oder einem anderen Profiler) und / oder FirePHP.
  2. Schalten Sie den Modus STRICT alle die PHP-Fehler + Benachrichtigungen zu erhalten.

Dadurch, dass Sie in der Lage sein:

  • Optimieren Sie Ihren Code. (Die Fehler / Warnung / Hinweise Entfernen können Sie den Code beschleunigen)
  • Reinigen Sie Ihren Code. (Mit Hilfe der richtigen Syntax php5 Objekt kann nur gut sein für die Leistung).

Das Objektmodell vollständig von PHP4 auf PHP5 geändert. Sicherlich wird der Modus STRICT Ihnen sagen, dass Sie keine explizite „bestanden by reference“ verwendet werden soll.

Andere Tipps

Ein gemeinsamer, den ich in einer Veröffentlichung von 5.2 gefunden wurde, dass strtotime ohne memory_get_usage sickerte es zu kontrollieren. Der Wechsel zu strptime das Problem behoben.

Es gibt einen Fehlerbericht für das für 5.2.8 - http: // Bugs .php.net / bug.php? id = 46889 .

Ohne Debugger können Sie ein Skript öffnen, dass Sie verwenden viele Speicher und Put-memory_get_usage Funktion in kritischen Einheimischen denken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top