Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] pętla foreach itp...
Forum PHP.pl > Forum > Przedszkole
Kazimir
Witam,
problem polega na tym, iż php alokuje w apachu zasoby do czasu zakonczenia pętli. W szybkim tempie przyrasta ilość zajętej pamięci. Jak można rozwiązać ten problem? Jest możliwość zwalniania zasobów po zakończeniu każdej iteracji? Czy powodem może być duża ilość zmiennych? Czy zastąpienie ich przez array() coś tu pomoże?

Dzięki za informacje smile.gif
Cysiaczek
Tak, jest taka możliwość. Po prostu wykonaj unset(). Jak konkretnie? Nie ma kodu, nie ma konkretnej podpowiedzi.

Pozdrawiam
Kazimir
sam kod działa bez problemu wiec nie podaje całości (nie mam w tej chwili do niego dostępu), więc proszę o nie szukanie literówek tylko skupienie sie na temacie - 100% zajęcie pamięci po przetworzeniu ok 2000 linków... deklarowałem unset tak jak poniżej. Możliwe, że coś skopałem...

  1. <?php
  2. include('simple_html_dom.php');
  3.  
  4. //załadowanie 400,000 linkow
  5. $linki = file('xyz.txt');
  6.  
  7. for ($licznik=0;licznik>=10000;$licznik++){
  8.  
  9. $dom = pobranie strony ('$linki[$licznik]')
  10.  
  11. //parsowanie
  12. $zmienna..
  13. .
  14. .
  15. ok 30 zmiennych
  16. .
  17. .
  18.  
  19. //zapisa do pliku zmiennych do 
  20. $F = fopen('plik.csv','a');
  21. fwrite($F,"$zmienna1;$zmienna2....");
  22. fclose($F);
  23.  
  24. //dla wszystkich zmiennych
  25. unset($zmienna);
  26. }
  27.  
  28. ?>


Dzieki za informacje smile.gif
cbagov
Musisz dzielic na pakiety a nie pchac cala kupe linkow na raz. Najlepiej robic to przy zapisie od razu z odpowiednia klasyfikacja. Inaczej mozesz sie pozegnac z odpowiednim czasem wykonania oraz pamiecia.
dr_bonzo
Kazimir: bez calego kodu trudno cokolwiek powiedziec, nie wiem czego w srodku uzywasz, bo moze nie mozna zwolnic pamieci ktora uzywasz, albo inaczej uzyc funkcji php, albo.... memory_get_usage() i sprawdzasz co sie nie zwalnia itp.
Kazimir
kod poniżej... wychodzi na to ze zasoby nie są zwalniane :/... parsowanie 1000 stron -> 640MB pamięci... dzięki za wszelkie informacje... btw. pierwsze kroki z php :P ... także prosze o wyrozumiałość :)

  1. <?php
  2. include('./simple_html_dom.php');
  3.  
  4. $i=0;
  5. while ($i<365000) {
  6. $linki=file("./pliki/plik.$i"); 
  7.  
  8. foreach ($linki as &$value) {
  9. $link = substr($value,0,-1);
  10. $dom = file_get_dom("$link");
  11. foreach($dom->find('table[class=kodywynik] tr') as $node){
  12. $item = trim($node->find('td',0)->plaintext);
  13. $podziel = explode("r\n", $item);
  14. $miasto = substr($podziel[0],13);
  15. $gmina = substr($podziel[1],7);
  16. $powiat = substr($podziel[2],8);
  17. $wojewodztwo = substr($podziel[3],13);
  18. }
  19.  
  20. if ($miasto=="") continue;
  21.  
  22. $re = $dom->find('#wynik_g2s b', 0)->plaintext;
  23. $ok = $dom->find('#wynik_g2s b', 1)->plaintext;
  24. $ap = $dom->find('#wynik_g2s b', 2)->plaintext;
  25.  
  26.  
  27. $adresr = $dom->find('#adres', 0)->plaintext;
  28. $adreso = $dom->find('#adres', 1)->plaintext;
  29. $adresa = $dom->find('#adres', 2)->plaintext;
  30.  
  31. unset($dom);
  32.  
  33.  
  34.  
  35. $daner = explode("r\n", $adresr);
  36. unset($adresr);
  37. $ulicar = substr($daner[1],12);
  38. $kodr = substr($daner[2],16,6);
  39. if ($kodr==" ") $kodr="";
  40. $mir = substr($daner[2],38);
  41. $telr1 = substr($daner[3],18);
  42. $telr2 = substr($daner[4],18);
  43. $faxr = substr($daner[5],17);
  44. $nrkontar = substr($daner[7],19);
  45. $bankobslugujacyr = substr($daner[8],18);
  46.  
  47.  
  48. $daneo = explode("r\n", $adreso);
  49. unset($adreso);
  50. $ulicao = substr($daneo[1],12);
  51. $kodo = substr($daneo[2],16,6);
  52. $mio = substr($daneo[2],38);
  53. if ($kodo==" ") $kodo="";
  54. $telo1 = substr($daneo[3],18);
  55. $telo2 = substr($daneo[4],18);
  56. $faxo = substr($daneo[5],17);
  57. $nrkontao = substr($daneo[7],19);
  58. $bankobslugujacyo = substr($daneo[8],18);
  59.  
  60.  
  61. $danea = explode("r\n", $adresa);
  62. unset($adresa);
  63. $ulicaa = substr($danea[1],12);
  64. $koda = substr($danea[2],16,6);
  65. $mia = substr($danea[2],38);
  66. if ($koda==" ") $koda="";
  67. $tela1 = substr($danea[3],18);
  68. $tela2 = substr($danea[4],18);
  69. $faxa = substr($danea[5],17);
  70. $nrkontaa = substr($danea[7],19);
  71. $bankobslugujacya = substr($danea[8],18);
  72.  
  73.  
  74. $F = fopen("t1.csv","a");
  75. fwrite($F,"'$miasto';'$gmina';'$powiat';'$wojewodztwo';
  76. '$re';'$ulicar';'$kodr';'$mir';'$telr1';'$telr2';'$faxr';'$nrkontar';
  77. '$bankobslugujacyr'\n'$miasto';'$gmina';'$powiat';'$wojewodztwo';
  78. '$ok';'$ulicao';'$kodo';'$mio';'$telo1';'$telo2';'$faxo';'$nrkontao';
  79. '$bankobslugujacyo'\n'$miasto';'$gmina';'$powiat';'$wojewodztwo';'$ap';
  80. '$ulicaa';'$koda';'$mia';'$tela1';'$tela2';'$faxa';'$nrkontaa';'$bankobslugujacya'\n");
  81. fclose($F);
  82.  
  83. unset($link);
  84. unset($node, $item, $podziel);
  85. unset($daner, $daneo, $danea);
  86. unset($miasto, $gmina, $powiat, $wojewodztwo, $re,
  87.  $ulicar, $kodr, $mir, $telr1, $telr2, $faxr, $nrkontar, 
  88. $bankobslugujacyr, $ok, $ulicao, $kodo, $mio, $telo1, 
  89. $telo2, $faxo, $nrkontao, $bankobslugujacyo, $ap, $ulicaa,
  90.  $koda, $mia, $tela1, $tela2, $faxa, $nrkontaa, $bankobslugujacya);
  91. unset($F);
  92. }
  93. unset($value); 
  94. $i=$i+1000;
  95. }
  96.  
  97. ?>
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.