Heim > Artikel > Backend-Entwicklung > Wie löst man das PHP-Speicherüberlaufproblem?
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.
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('1',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('1',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
Die Funktion kann nur dann Speicherplatz freigeben, wenn der Variablenwert mehr als 256 Byte Speicherplatz belegt. unset()
Verwandte Lernempfehlungen:
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!