Maison  >  Article  >  développement back-end  >  Comment résoudre le problème de débordement de mémoire PHP ?

Comment résoudre le problème de débordement de mémoire PHP ?

coldplay.xixi
coldplay.xixioriginal
2020-07-01 16:27:454887parcourir

Méthodes pour résoudre le problème de débordement de mémoire PHP : 1. Augmenter la taille de la mémoire disponible de PHP ; 2. Traiter les tableaux par lots et détruire les variables utilisées à temps ; 3. Réduire autant que possible l'utilisation de variables statiques ; 4. , Une fois l'opération de base de données terminée, la connexion doit être fermée immédiatement.

Comment résoudre le problème de débordement de mémoire PHP ?

Méthodes pour résoudre le problème de débordement de mémoire PHP :

1. Solution de débordement de mémoire

Lors de l'analyse statistique des données, nous rencontrons souvent de grands tableaux et un débordement de mémoire peut se produire. Ici, je vais partager ma solution. Utilisons un exemple pour illustrer ce problème, comme suit :

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 la mémoire taille que PHP peut utiliser 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, ce n'est pas difficile à voir :

1 D'une part, il faut augmenter la taille de la mémoire disponible de PHP. D'autre part, tant qu'on trouve. un moyen de traiter le tableau par lots, de diviser pour régner, les variables utilisées sont détruites dans le temps (unset), et généralement il n'y aura pas de problèmes de débordement.

2. 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 (&).

3. 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.

2. Le problème de la destruction des variables et de la libération de mémoire

La fonction unset() de PHP est utilisée pour effacer et détruire les variables. Nous pouvons utiliser unset() pour détruire les variables inutilisées. Mais parfois, utiliser unset() ne peut pas détruire la mémoire occupée par la variable ! Regardons d'abord un exemple :

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

affiche finalement la mémoire occupée avant unset() moins la mémoire occupée après unset() Si c'est un nombre positif, cela signifie que unset($s) a détruit $s de. la mémoire (ou en d'autres termes, l'utilisation de la mémoire est réduite après unset()), mais sous les plateformes PHP5 et Windows, le résultat que j'ai obtenu est : 0. Cela signifie-t-il que unset($s) ne détruit pas la mémoire occupée par la variable $s ? Reprenons l'exemple suivant :

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

Cet exemple est presque le même que l'exemple ci-dessus. La seule différence est que $s est composé de 256 1, soit un 1 de plus que le premier exemple, et on obtient Le résultat est : 272. Cela signifie-t-il que unset($s) a détruit la mémoire occupée par $s ?

A travers l'exemple ci-dessus, nous pouvons tirer les conclusions suivantes :

Conclusion 1. unset()La fonction ne peut libérer de l'espace mémoire que lorsque la valeur de la variable occupe plus de 256 octets d'espace mémoire.

Conclusion 2. La mémoire ne sera libérée que lorsque toutes les variables (telles que les variables de référence) pointant vers la variable seront détruites.

Recommandations d'apprentissage associées : Programmation PHP de l'entrée à la maîtrise

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn