Heim  >  Artikel  >  Backend-Entwicklung  >  Wie löst man das PHP-Speicherüberlaufproblem?

Wie löst man das PHP-Speicherüberlaufproblem?

coldplay.xixi
coldplay.xixiOriginal
2020-07-01 16:27:454887Durchsuche

Methoden zur Lösung des PHP-Speicherüberlaufproblems: 1. Erhöhen Sie die verfügbare Speichergröße von PHP. 2. Verarbeiten Sie Arrays in Stapeln und zerstören Sie verwendete Variablen rechtzeitig. 3. Reduzieren Sie die Verwendung statischer Variablen so weit wie möglich. 4. Nach Abschluss des Datenbankvorgangs muss die Verbindung sofort geschlossen werden.

Wie löst man das PHP-Speicherüberlaufproblem?

Methoden zur Lösung des PHP-Speicherüberlaufproblems:

1. Lösung für Speicherüberlauf

Bei der statistischen Analyse von Daten stoßen wir oft auf große Arrays und es kann zu einem Speicherüberlauf kommen. Hier werde ich meine Lösung vorstellen. Lassen Sie uns dieses Problem anhand eines Beispiels wie folgt veranschaulichen:

Angenommen, die Anzahl der im Protokoll gespeicherten Datensätze beträgt 500.000, dann lautet die Lösung wie folgt:

ini_set(‘memory_limit’,’64M’); 

//Speicher zurücksetzen Größe, die PHP verwenden kann. Im Allgemeinen kann die Datei php.ini nicht auf dem Remote-Host geändert und nur über das Programm festgelegt werden.

Hinweis: Im safe_mode (abgesicherten Modus) ist ini_set ungültig.

set_time_limit(600);//设置超时限制为6分钟
$farr = $Uarr = $Marr = $IParr = $data = $_sub = array();
$spt = ”$@#!$”;
$root = ”/Data/webapps/VisitLog”;
$path = $dpath = $fpath = NULL;
$path = $root.”/”.date(“Y-m”,$timestamp);
$dpath = $path.”/”.date(“m-d”,$timestamp);
for($j=0;$j<24;$j++){
$v = ($j < 10) ? ”0″.$j : $j;
$gpath = $dpath.”/”.$v.”.php”;
if(!file_exists($gpath)){
continue;
} else {
$arr = file($gpath);////将文件读入数组中
array_shift($arr);//移出第一个单元-》<?php exit;?>
$farr = array_merge($farr,$arr);
unset($arr);
}
}
if(empty($this->farr)){
echo ”<p><center>没有相关记录!</center></p>”;
exit;
}
while(!empty($farr)){
$_sub = array_splice($farr, 0, 10000); //每次取出$farr中1000个
for($i=0,$scount=count($_sub);$i<$scount;$i++){
$arr = explode($spt,$_sub[$i]);
$Uarr[] = $arr[1]; //vurl
$Marr[] = $arr[2]; //vmark
$IParr[] = $arr[3].” |$nbsp;”.$arr[1]; //IP
}
unset($_sub);//用完及时销毁
}
unset($farr);

Hier ist es nicht schwer zu erkennen:

Einerseits müssen wir die verfügbare Speichergröße von PHP erhöhen, andererseits, solange wir finden eine Möglichkeit, das Array stapelweise zu verarbeiten, zu teilen und zu erobern. Verwendete Variablen werden rechtzeitig zerstört (unset) und im Allgemeinen treten keine Überlaufprobleme auf.

2. Um den Speicherverbrauch des PHP-Programms zu senken, sollten wir außerdem die Verwendung statischer Variablen so weit wie möglich reduzieren. Wenn eine Wiederverwendung von Daten erforderlich ist, können Sie die Verwendung von Referenzen (&) in Betracht ziehen.

3. Ein weiterer Punkt ist: Nach Abschluss der Datenbankoperation muss die Verbindung sofort geschlossen werden, nachdem ein Objekt verwendet wurde. __destruct()

2. Das Problem der nicht gesetzten Zerstörung von Variablen und der Freigabe von Speicher

PHPs

-Funktion wird zum Löschen und Zerstören von Variablen verwendet. Wir können unset() verwenden, um nicht verwendete Variablen zu zerstören. Aber manchmal kann die Verwendung von unset() den von der Variablen belegten Speicher nicht zerstören! Schauen wir uns zunächst ein Beispiel an: unset()

<?php
$s=str_repeat(&#39;1&#39;,255); //产生由255个1组成的字符串
$m=memory_get_usage(); //获取当前占用内存
unset($s);
$mm=memory_get_usage(); //unset()后再查看当前占用内存
echo $m-$mm;
?>

gibt schließlich den vor

belegten Speicher abzüglich des nach unset() belegten Speichers aus. Wenn es sich um eine positive Zahl handelt, bedeutet dies, dass unset() $s zerstört hat der Speicher (oder mit anderen Worten, die Speichernutzung wird nach unset() reduziert), aber unter PHP5- und Windows-Plattformen ist das Ergebnis, das ich erhalten habe: 0. Bedeutet das, dass unset($s) den von der Variablen $s belegten Speicher nicht zerstört? Machen wir noch einmal das folgende Beispiel: unset($s)

<?php
$s=str_repeat(&#39;1&#39;,256); //产生由256个1组成的字符串
$m=memory_get_usage(); //获取当前占用内存
unset($s);
$mm=memory_get_usage(); //unset()后再查看当前占用内存
echo $m-$mm;
?>

Dieses Beispiel ist fast das gleiche wie das obige Beispiel. Der einzige Unterschied besteht darin, dass

aus 256 Einsen besteht, also eine Eins mehr als das erste Beispiel, und wir bekommen Das Ergebnis ist: 272. Bedeutet das, dass $s den von unset($s) belegten Speicher zerstört hat? $s

Anhand des obigen Beispiels können wir die folgenden Schlussfolgerungen ziehen:

Schlussfolgerung 1.

Die Funktion kann nur dann Speicherplatz freigeben, wenn der Variablenwert mehr als 256 Byte Speicherplatz belegt. unset()

Schlussfolgerung 2. Der Speicher wird nur freigegeben, wenn alle Variablen (z. B. Referenzvariablen), die auf die Variable verweisen, zerstört werden.

Verwandte Lernempfehlungen:

PHP-Programmierung vom Einstieg bis zur Beherrschung

Das obige ist der detaillierte Inhalt vonWie löst man das PHP-Speicherüberlaufproblem?. 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