J'ai une boucle do/while qui va au-dessus des lignes de base de données. Parce qu'il s'exécute plusieurs jours au moment de traiter 100000s de lignes, la consommation de mémoire est important de garder le contrôle ou il va planter. À l'heure actuelle, chaque itération ajoute environ 4 Ko à l'utilisation de la mémoire du script. J'utilise memory_get_usage() pour surveiller l'utilisation. Je désinsère toutes les variables utilisées dans la boucle à chaque itération, donc je ne sais vraiment pas ce que je pourrais faire d'autre. Ma conjecture est que do/while rassemble des données à chaque itération et c'est ce qui consomme les 4kb de mémoire. Je sais que 4kb ne sonne pas beaucoup mais il commence bientôt à s'additionner quand vous avez 100000s d'itérations. Quelqu'un peut-il suggérer une autre façon de parcourir une grande quantité de lignes de base de données ou comment éliminer cette "fuite de mémoire"?PHP & do/while fuite de mémoire en boucle
éditer Voici le code de la boucle UPDATED. Au dessus, il n'y a que quelques require_once() s.
$URLs = new URLs_url(db());
$c = new Curl;
$c->headers = 1;
$c->timeout = 60;
$c->getinfo = true;
$c->follow = 0;
$c->save_cookies = false;
do {
// Get url that hasn't been checked for a week
$urls = null;
// Check week old
$urls = $URLs->all($where)->limit(10);
foreach($urls as $url) {
#echo date("d/m/Y h:i").' | Checking '.$url->url.' | db http_code: '.$url->http_code;
// Get http code
$c->url = $url->url;
$data = $c->get();
#echo ' - new http_code: '.$data['http_code'];
// Save info
$url->http_code = $data['http_code'];
$url->lastchecked = time();
$URLs->save($url);
$url = null;
#unset($c);
$data = null;
#echo "\n".memory_get_usage().' | ';
echo "\nInner loop memory usage: ".memory_get_usage();
}
echo "\nOuter loop memory usage: ".memory_get_usage();
} while($urls);
Certains journaux comment la consommation de mémoire se comporte dans les deux boucles:
Inner loop memory usage: 611080
Inner loop memory usage: 612452
Inner loop memory usage: 613788
Inner loop memory usage: 615124
Inner loop memory usage: 616460
Inner loop memory usage: 617796
Inner loop memory usage: 619132
Inner loop memory usage: 620500
Inner loop memory usage: 621836
Inner loop memory usage: 623172
Outer loop memory usage: 545240
Inner loop memory usage: 630680
Inner loop memory usage: 632016
Inner loop memory usage: 633352
Inner loop memory usage: 634688
Inner loop memory usage: 636088
Inner loop memory usage: 637424
Inner loop memory usage: 638760
Inner loop memory usage: 640096
Inner loop memory usage: 641432
Inner loop memory usage: 642768
Outer loop memory usage: 556392
Inner loop memory usage: 640416
Inner loop memory usage: 641752
Inner loop memory usage: 643088
Inner loop memory usage: 644424
Inner loop memory usage: 645760
Inner loop memory usage: 647096
Inner loop memory usage: 648432
Inner loop memory usage: 649768
Inner loop memory usage: 651104
Inner loop memory usage: 652568
Outer loop memory usage: 567608
Inner loop memory usage: 645924
Inner loop memory usage: 647260
Inner loop memory usage: 648596
Inner loop memory usage: 649932
Inner loop memory usage: 651268
Inner loop memory usage: 652604
Inner loop memory usage: 653940
Inner loop memory usage: 655276
Inner loop memory usage: 656624
Inner loop memory usage: 657960
Outer loop memory usage: 578732
postez aussi votre code. – Sarfraz
Les boucles ne fuient généralement pas la mémoire, les choses dans les boucles le font, nous montrent du code afin que nous puissions aider à diagnostiquer le vrai problème. –
Voici le code. J'espère que cela aide. –