Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zwalnianie pamięci
115750
post 25.11.2014, 15:28:57
Post #1





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 7.06.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.

Ten post edytował 115750 25.11.2014, 15:31:14
Go to the top of the page
+Quote Post
Crozin
post 25.11.2014, 15:35:00
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
irmidjusz
post 25.11.2014, 21:13:20
Post #3





Grupa: Zarejestrowani
Postów: 279
Pomógł: 60
Dołączył: 25.02.2012

Ostrzeżenie: (0%)
-----


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.


--------------------
there is much to be learned
Go to the top of the page
+Quote Post
115750
post 26.11.2014, 10:44:40
Post #4





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 7.06.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
Pyton_000
post 27.11.2014, 09:55:40
Post #5





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Ło matko, 10tyś razy nawiązujesz połączenie z BD.
Go to the top of the page
+Quote Post
aniolekx
post 27.11.2014, 10:06:34
Post #6





Grupa: Zarejestrowani
Postów: 340
Pomógł: 46
Dołączył: 31.07.2009
Skąd: A

Ostrzeżenie: (0%)
-----


@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
Go to the top of the page
+Quote Post
Pyton_000
post 27.11.2014, 10:34:23
Post #7





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Ja nawet nie próbowałem bo śmietnik niemiłosierny.
Go to the top of the page
+Quote Post
115750
post 27.11.2014, 10:58:38
Post #8





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 7.06.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.

Ten post edytował 115750 27.11.2014, 12:37:23
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 02:16