Maison  >  Article  >  développement back-end  >  Dépannage pour éviter le débordement de mémoire dans le processus PHP

Dépannage pour éviter le débordement de mémoire dans le processus PHP

藏色散人
藏色散人avant
2020-06-24 13:42:112468parcourir

La taille de la mémoire du processus PHP peut être définie par défaut dans le fichier de configuration memory_limit=128M

. le programme ini_set('memory_limit', '1024M'); Réglez-le comme ça C'est 1G. Cependant, ce paramétrage n'est généralement pas effectué car il affectera d'autres services de la machine. Parfois, vous pouvez vérifier le code. Plusieurs fois, un débordement de mémoire se produit parce que les variables PHP ne sont pas libérées à temps ou lors du parcours d'un tableau relativement grand.

1. Dépannage

memory_get_usage() PHP a cette fonction système pour obtenir la quantité d'espace mémoire utilisée par le processus actuel. L'unité renvoyée est round(memory_get_usage()/1024/1024, 2).'MB', convertie en MB

peut suivre les changements de mémoire pendant l'exécution du code.

2. Cas courants de débordement de mémoire

Parcourez un grand tableau et modifiez certaines valeurs du tableau, ce qui entraîne une copie du tableau pendant le processus de parcours.

La caractéristique des variables PHP est la "copie en écriture".

Quand il s'agit de l'affectation du tableau $arr, elle sera divisée et générera une nouvelle structure HashTable, provoquant l'utilisation de la mémoire. pour changer instantanément. Grande

3. Traversez et attribuez d'autres variables

$arr = range(0, 599999);
echo &#39;foreach前内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;
foreach($arr as $key => $item) {
    $arr[$key] = $item + 1;
    if($item % 100000 == 0) {
        echo &#39;foreach中内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;
    }
}
echo &#39;foreach后内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;

//输出
/*
foreach前内存:49.9MB
foreach中内存:81.36MB
foreach中内存:84.42MB
foreach中内存:87.47MB
foreach中内存:90.52MB
foreach中内存:93.57MB
foreach中内存:96.62MB
foreach后内存:49.9MB
*/

solution, utilisez le parcours de référence

$arr = range(0, 599999);
echo &#39;foreach前内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;

foreach($arr as $key => &$item) {
    $arr[$key] = $item + 1;
    if($item % 100000 == 0) {
        echo &#39;foreach中内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;
    }
}unset($key);unset($item);
Une fois le parcours terminé, n'oubliez pas de unset($key);unset($item); Parce que $item est une référence au dernier élément du tableau, si vous modifiez cette variable ultérieurement, elle sera directement modifié au tableau.

Recommandé : "

Tutoriel vidéo PHP

"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer