Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zwalnianie pamięci
Forum PHP.pl > Forum > PHP
115750
Czy w PHP istnieją jakieś mechanizmy zwalniania pamięci?
Mam skrypt, który wykonuje dość długą pętlę. Z każdym kolejnym przebiegiem pętli rośnie zużycie pamieci przez php.
Mam wrażenie, że jakieś zmienne zajmują kolejne obszary pamięci.
Crozin
Możesz usunąć (unset) bądź nadpisać (np.: $zm = null) daną zmienną. O ile będzie ona jedyną referencją do danego obszaru pamięci powinna zostać zwolniona pamięć po niej.

Jeżeli możesz postaraj się uprościć/skrócić kod i pokaż nam go.
irmidjusz
Oprócz nullowania, unsetowania i używania referencji, możesz też jawnie wywołać czyszczenie pamięci przez gc. Trudno powiedzieć, co Twój kod wyczynia.
115750
Uprościłem w miarę ten kod i wklejam go do analizy.
Skrypt ma sprawdzać po serię numerów seryjnych. Jeśli istnieją one już w lokalnej bazie, to przechodzi do kolejnego numeru.
Jeśli numeru nie ma w lokalnej bazie, to ma pobierać go ze strony, parsować otrzymane dane i zapisać je w bazie.

  1. <?
  2.  
  3. for($no=0;$no<100000;$no++)
  4. {
  5.  
  6. $no_cos=sprintf("55%06d",$no);
  7. $cos_read = '';
  8.  
  9. echo "\n\r".$no_cos;
  10.  
  11.  
  12. # Sprawdzenie, czy cos już jest obecny w BD.
  13.  
  14. $zapytanie = sprintf("SELECT T1.cos, T1.exist FROM cos_ckd as T1 WHERE T1.cos='%s'", $no_cos);
  15.  
  16. // Połączenie z bd
  17. require_once('db.inc.php');
  18.  
  19. $wynik = mysql_query($zapytanie);
  20.  
  21. if (mysql_num_rows($wynik))
  22. {
  23. $wiersz = mysql_fetch_array($wynik, MYSQL_BOTH);
  24. if ($wiersz['exist']>=0) echo 'Jest';
  25. elseif ($wiersz['exist']==-1) echo 'Numer nie istnieje';
  26.  
  27. continue;
  28.  
  29. $wiersz['params']=$no_cos.','.$wiersz['model'].','.$wiersz['params'];
  30. $cos_read = explode(",", $wiersz['params']);
  31.  
  32. $dane_cos[1] = $wiersz['date'];
  33. $dane_cos[2] = $wiersz['mode'];
  34. }
  35. else
  36. {
  37. // example of how to modify HTML contents
  38. include_once('simplehtml/simple_html_dom.php');
  39.  
  40. // get DOM from URL or file
  41. $html='';
  42. while(empty($html))
  43. {
  44. $html = @file_get_html('http://xxx/?cos='.$no_cos);
  45. if (empty($html)) echo '.';
  46. }
  47.  
  48. // Tworzenie tabeli
  49. foreach($html->find('strong') as $e)
  50. $cos_read[] = $e->plaintext;
  51.  
  52. $j=0;
  53. foreach($html->find('td') as $td)
  54. {
  55. if ($j == 8 || $j == 16) $dane_cos[$j / 8] = $td->plaintext;;
  56. $j++;
  57. if ($j > 16)break;
  58. }
  59. }
  60. if (!IsSet($cos_read[1]))
  61. {
  62. echo("\n\r".$no_cos.' - nie znaleziono numeru.');
  63.  
  64. $insert_2 = sprintf("INSERT INTO cos_ckd (cos, exist) VALUES ('%s','-1')", $no_cos);
  65. mysql_query($insert_2, $link);
  66. }
  67. else
  68. {
  69.  
  70.  
  71.  
  72. $cos_el_numb = count($cos_read);
  73.  
  74.  
  75. // tworzymy zapytanie do BD
  76. $zapytanie = "SELECT code, description FROM cos_eq WHERE code='".$cos_read[2]."'";
  77. $code = '';
  78. $code2 = $cos_read[2];
  79.  
  80. for($i=3;$i<$cos_el_numb;$i++)
  81. {
  82. $code = $code. " OR code='". $cos_read[$i]."'";
  83. $code2 = $code2.','.$cos_read[$i];
  84. }
  85.  
  86. $zapytanie = $zapytanie.$code;
  87. $wynik = mysql_query($zapytanie);
  88.  
  89. if (mysql_num_rows($wynik))
  90. {
  91. while($wiersz = mysql_fetch_array($wynik, MYSQL_BOTH))
  92. {
  93. echo ''.$wiersz['code'].''.$wiersz['description'].'';
  94. $cos_temp[$wiersz['code']] = 1;
  95. }
  96.  
  97. }
  98.  
  99. echo '';
  100.  
  101. ## Uzupełnianie wyposażenia w BD
  102. if (substr($no_cos, 0, 6) =='XXX555')
  103. {
  104.  
  105. $cos_temp_numb = count($cos_temp);
  106.  
  107. if($cos_temp_numb < ($cos_el_numb - 2))
  108. {
  109. $insert = "INSERT INTO cos_eq (code) VALUES ";
  110. $code = '';
  111.  
  112. for($i=2;$i<$cos_el_numb;$i++)
  113. {
  114. if(!IsSet($cos_temp[$cos_read[$i]]))
  115. {
  116. if (IsSet($coma_exist)) $code = $code.', ';
  117. $coma_exist = true;
  118. $code = $code. "('".$cos_read[$i]."')";
  119. }
  120. }
  121.  
  122. $insert=$insert.$code;
  123.  
  124. echo 'Brak opisów dla kodów: '.$code.'Zgłoś problem administratorowi!';
  125.  
  126.  
  127. mysql_query($insert, $link);
  128. if (mysql_errno($link)) die ('Błąd zapisu: ' . mysql_error());
  129. }
  130. }
  131.  
  132. ## Zapisanie sprawdzanego cos do bazy lub podbicie licznika.
  133.  
  134. require_once('cos_bd.inc.php');
  135.  
  136. $insert_3 = sprintf("INSERT INTO cos_ckd (cos, exist) VALUES ('%s','1')", $no_cos);
  137. mysql_query($insert_3, $link);
  138.  
  139.  
  140.  
  141. $date = sprintf("%s-%s-%s", substr($dane_cos[1], 6, 4), substr($dane_cos[1], 3, 2), substr($dane_cos[1], 0, 2));
  142. $insert_2 = sprintf("INSERT INTO cos_decode (cos, params, model, mode, date) VALUES ('%s','%s',%d, %d, '%s')", $no_cos, $code2, $model, $silnik, $date);
  143.  
  144. mysql_query($insert_2, $link);
  145. if (mysql_errno($link))
  146. if (mysql_errno($link)==1062)
  147. {
  148. $zapytanie = 'UPDATE cos_decode SET checked=checked WHERE cos="'.$no_cos.'"';
  149. mysql_query($zapytanie, $link);
  150. if (mysql_errno($link)) die ('Błąd zapisu: ' . mysql_error());
  151. }
  152. else
  153. die ('B - Błąd zapisu: ' . mysql_errno($link).' - '.mysql_error());
  154.  
  155. }
  156. }
  157.  
  158.  
  159. ?>
Pyton_000
Ło matko, 10tyś razy nawiązujesz połączenie z BD.
aniolekx
@Pyton_000 to jest chyba jakaś nowa szkoła programowania, koleś robi copy/paste z kilku źródeł a jak nie działa jak powinno to na forum ze nie działa ;p Inaczej tego kodu nie potrafię opisać ;p
Pyton_000
Ja nawet nie próbowałem bo śmietnik niemiłosierny.
115750
Ta pętla for jest tam dołożona później, do oryginalnego skryptu, więc przez to wygląda to jak wygląda.
Dzięki za te uwagi, już to wyrzuciłem poza pętlę.

Doszedłem już do tego, że funkcja file_get_html() powoduje te problemy. Z każdym wykonaniem tej funkcji rośnie zużycie pamięci.
Starczyło wywołać metodę $html->clear() i jest ok.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.