Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Speicherleck im PHP-Skript

Dieses Speicherleck wäre nur dann ein Problem, wenn es das Skript mit einem "Speicher erschöpft"-Fehler beendet. PHP wird alle ungenutzten Objekte/Variablen gerne selbst in den Garbage Collection einsammeln, aber der Collector wird nicht kicken, bis es sein muss - Garbage Collection kann eine sehr teure Operation sein.

Es ist normal, dass die Speichernutzung ansteigt, selbst wenn Sie ständig dieselben Objekte/Variablen wiederverwenden - erst wenn die Speichernutzung ein bestimmtes Niveau überschreitet, wird der Kollektor starten und das Haus aufräumen.

Ich vermute, dass Sie die Dinge viel schneller laufen lassen könnten, wenn Sie Benutzer-IDs in Gruppen zusammenfassen und weniger Updates herausgeben und mehr Datensätze mit jeder ändern. z.B. Gehen Sie folgendermaßen vor:

UPDATE user_roundscores SET ursUpdDate=NOW() WHERE ursUserTeamIdFK IN (id1, id2, id3, id4, id5, etc...)

anstatt es mit einem Update pro Benutzer zu tun. Weniger Roundtrips durch die DB-Schnittstellenschicht und mehr Zeit auf dem Server =schnellere Ausführung.

Bedenken Sie auch die Auswirkungen der Erweiterung auf Millionen von Benutzern, wie Sie in einem Kommentar sagen. Eine Million einzelne Updates werden eine nicht triviale Zeit in Anspruch nehmen, also NOW() wird keine "Konstante" sein. Wenn der vollständige Durchlauf 5 Minuten dauert, erhalten Sie eine Vielzahl von ursUpdDate Zeitstempel. Vielleicht möchten Sie erwägen, ein einzelnes NOW() zwischenzuspeichern Rufen Sie eine serverseitige Variable auf und geben Sie die Aktualisierungen für diese Variable aus:

 SELECT @cachednow :p NOW();
 UPDATE .... SET ursUpDate = @cachednow WHERE ....;