Heim  >  Artikel  >  PHP-Framework  >  Wird der Swoole-Speicher immer größer?

Wird der Swoole-Speicher immer größer?

(*-*)浩
(*-*)浩Original
2019-12-12 11:45:593713Durchsuche

Wird der Swoole-Speicher immer größer?

Server-Speicherverwaltungsmechanismus

Das zugrunde liegende Prinzip der Speicherverwaltung nach dem Start des Servers ist das gleiche wie das gewöhnliches PHP-CLI-Programm. Weitere Informationen finden Sie im Artikel zur Zend VM-Speicherverwaltung.

Lokale Variablen (Empfohlenes Lernen: SWOOLE-Video-Tutorial )

Nachdem die Ereigniswiederherstellungsfunktion zurückgegeben wurde, werden alle lokalen Objekte und Variablen recycelt . Eine Deaktivierung ist nicht erforderlich. Wenn es sich bei der Variablen um einen Ressourcentyp handelt, wird die entsprechende Ressource auch von der untersten Schicht von PHP freigegeben.

function test()
{
    $a = new Object;
    $b = fopen('/data/t.log', 'r+');
    $c = new swoole_client(SWOOLE_SYNC);
    $d = new swoole_client(SWOOLE_SYNC);
    global $e;
    $e['client'] = $d;
}

$a, $b, $c sind alle lokale Variablen. Wenn diese Funktion zurückkehrt, werden diese drei Variablen sofort freigegeben, der entsprechende Speicher wird sofort freigegeben und das geöffnete E/A-Ressourcendatei-Handle wird sofort freigegeben sofort geschlossen.

$d ist ebenfalls eine lokale Variable, wird jedoch vor der Rückgabe in der globalen Variablen $e gespeichert und daher nicht freigegeben. Wenn unset($e['client']) ausgeführt wird und keine anderen PHP-Variablen mehr auf die Variable $d verweisen, wird $d freigegeben.

Globale Variablen

In PHP gibt es drei Arten globaler Variablen.

Variablen, die mit dem Schlüsselwort global deklariert werden

Statische Klassenvariablen und statische Funktionsvariablen, die mit dem Schlüsselwort static deklariert werden

Super globale Variablen von PHP, einschließlich $_GET, $_POST, $ GLOBALE usw.

Globale Variablen und Objekte, statische Klassenvariablen und auf dem Serverobjekt gespeicherte Variablen werden nicht freigegeben. Programmierer müssen sich selbst um die Zerstörung dieser Variablen und Objekte kümmern.

class Test
{
    static $array = array();
    static $string = '';
}
function onReceive($serv, $fd, $reactorId, $data)
{
    Test::$array[] = $fd;
    Test::$string .= $data;
}

Sie müssen dem Array-Typwert nicht lokaler Variablen in der Ereignisrückruffunktion besondere Aufmerksamkeit schenken. Bestimmte Vorgänge wie TestClass::$array[] = „string“ können zu Speicherverlusten führen In schweren Fällen kann es zu einer Speicherexplosion kommen. Bei Bedarf sollte darauf geachtet werden, große Arrays zu bereinigen.

In der Ereignisrückruffunktion müssen Sie beim Verketten von Zeichenfolgen nicht lokaler Variablen auf Speicherlecks achten, z. B. TestClass::$string .= $data. Es kann zu Speicherlecks kommen, und zwar in schwerwiegenden Fällen In einigen Fällen kann es zu einer Speicherexplosion kommen.

Das obige ist der detaillierte Inhalt vonWird der Swoole-Speicher immer größer?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn