Maison >développement back-end >Problème PHP >Causes courantes de débordement de mémoire PHP
Un débordement de mémoire signifie qu'il y a de la mémoire irrécupérable dans le système d'application ou qu'une trop grande quantité de mémoire est utilisée, ce qui rend finalement la mémoire utilisée par le programme pour s'exécuter supérieure à la mémoire maximale que la machine virtuelle peut fournir.
Il existe de nombreuses raisons de débordement de mémoire, les plus courantes sont les suivantes :
La quantité de données chargées dans la mémoire est trop volumineux Énorme, comme récupérer trop de données de la base de données à la fois (Apprentissage recommandé : Tutoriel vidéo PHP)
Il existe des références à des objets dans la classe de collection, qui sont non effacé après utilisation
Il y a une boucle infinie dans le code ou la boucle génère trop d'entités d'objet en double
BUG dans le logiciel tiers utilisé
La valeur de mémoire du paramètre de démarrage est trop petite ;
Supposons que le nombre d'enregistrements stockés dans le journal soit de 500 000, alors la solution est la suivante :
ini_set( 'memory_limit','64M'); //Réinitialiser PHP peut être utilisé. La taille de la mémoire est de 64 Mo. Généralement, le fichier php.ini ne peut pas être modifié sur l'hôte distant et ne peut être défini que via le programme. Remarque : En safe_mode (mode sans échec), ini_set n'est pas valide
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);
Ici, il n'est pas difficile de voir que d'une part, nous devons augmenter la taille de la mémoire disponible de PHP, d'autre part. tant que nous trouvons un moyen de traiter le tableau par lots, de diviser pour mieux régner, de détruire (désactiver) les variables utilisées à temps, et généralement il n'y aura pas de problèmes de débordement.
De plus, afin d'économiser la consommation de mémoire du programme PHP, nous devons réduire autant que possible l'utilisation de variables statiques. Lorsque la réutilisation des données est nécessaire, vous pouvez envisager d'utiliser des références (&). Un autre point est : une fois l'opération de base de données terminée, la connexion doit être fermée immédiatement ; après l'utilisation d'un objet, le destructeur (__destruct()) doit être appelé rapidement.
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!