Heim  >  Artikel  >  Backend-Entwicklung  >  Was passiert, wenn PHP-Speicherlecks auftreten?

Was passiert, wenn PHP-Speicherlecks auftreten?

王林
王林Original
2019-09-20 11:53:183257Durchsuche

Was passiert, wenn PHP-Speicherlecks auftreten?

Situation 1. Die Programmbetriebsdaten sind zu groß

Szenariowiederherstellung: Einmaliger Messwert überschreitet den oberen Wert Begrenzung des verfügbaren Speichers von PHP Die Daten verursachen Speichererschöpfung

Lösung:

1. Probleme, die mit Geld gelöst werden können, sind keine Probleme Es gibt nicht viele Möglichkeiten, große Dateien zu lesen, und die Obergrenze ist vorhersehbar. Verwenden Sie dann ini_set('memory_limit', '1G');, um einen größeren Wert oder memory_limit=-1 festzulegen. Wenn Sie über genügend Speicher verfügen, können Sie das Programm weiter ausführen.

2. Wenn das Programm auf einer Maschine mit kleinem Speicher normal verwendet werden soll, muss das Programm optimiert werden. Wie unten gezeigt, ist der Code viel komplizierter.

<?php
ini_set(&#39;memory_limit&#39;, &#39;128M&#39;);
$string = str_pad(&#39;1&#39;, 128 * 1024 * 1024);

Fall 2, Eine Kopie wird generiert, wenn das Programm mit großen Datenmengen arbeitet

Szenariowiederherstellung: große Variablen Während der Ausführung wurde eine Kopie erstellt, was zu unzureichendem Speicher führte.

<?php
 //php7 以下版本通过 composer 引入 paragonie/random_compat ,为了方便来生成一个随机名称的临时文件 
require "vendor/autoload.php";
 ini_set(&#39;memory_limit&#39;, &#39;128M&#39;); 
//生成临时文件存放大字符串 
$fileName = &#39;tmp&#39;.bin2hex(random_bytes(5)).&#39;.txt&#39;; touch($fileName);

for ( $i = 0; $i < 128; $i++ ) {    
    $string = str_pad(&#39;1&#39;, 1 * 1024 * 1024);
    file_put_contents($fileName, $string, FILE_APPEND); 
} 
$handle = fopen($fileName, "r"); 
for ( $i = 0; $i <= filesize($fileName) / 1 * 1024 * 1024; $i++ ) {   //do something   
    $string = fread($handle, 1 * 1024 * 1024); 
} 
fclose($handle); 
unlink($fileName);

Lösung:

Geben Sie nutzlose Variablen frühzeitig frei oder manipulieren Sie Originaldaten in Form von Referenzen.

<?php 
ini_set("memory_limit",&#39;1M&#39;); 
$string = str_pad(&#39;1&#39;, 1* 750 *1024); 
$string2 = $string; 
$string2 .= &#39;1&#39;;

Szenario drei, Irrationale Konfiguration und Erschöpfung der Systemressourcen

Szenariowiederherstellung: Unzureichender Speicher aufgrund unangemessener Konfiguration, 2G-Speichermaschine Die obige Einstellung kann bis zu 100 PHP-FPM-Unterprozesse starten, aber nachdem tatsächlich 50 PHP-FPM-Unterprozesse gestartet wurden, können keine weiteren Prozesse gestartet werden.

Lösung:

Stellen Sie post_max_size, max_file_uploads, upload_max_filesize, max_input_vars, max_input_nesting_level und andere Parameter angemessen ein und optimieren Sie PHP-FPM-bezogene Parameter.

Szenario 4. Unbrauchbare Daten werden nicht rechtzeitig freigegeben

Szenario-Wiederherstellung: Dieses Problem ist aus der Sicht nicht logisch Programmlogik Problem, aber nutzlose Daten beanspruchen viel Speicher und führen zu unzureichenden Ressourcen. Eine Codeoptimierung sollte angestrebt werden.

Der folgende Code wird verwendet, um Datenbankoperationen in der Laravel-Entwicklung zu überwachen:

<?php 
ini_set("memory_limit",&#39;1M&#39;); 
$string = str_pad(&#39;1&#39;, 1* 750 *1024); 
$string2 = $string; 
unset($string); 
$string2 .= &#39;1&#39;;

Lösung:

In diesem Fall übergeben Sie DB The Die Methode ::listen ruft Datensätze aller ausgeführten SQL-Anweisungen ab und schreibt sie in das Protokoll. In der Entwicklungsumgebung spielt dies keine Rolle, andere Methoden können deaktiviert werden Wird verwendet, um die ausgeführten SQL-Anweisungen abzurufen und zu protokollieren.

Empfohlenes Tutorial;

PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWas passiert, wenn PHP-Speicherlecks auftreten?. 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