Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: błąd przydzielania pamieci dla skryptu
Forum PHP.pl > Forum > PHP
DK.log
Witam.

Pierwszy raz spotakłem się z czyms takim.

W skrypcie PHP w momencie próby zbudowania zmiennej tablicowej w pętli, wywala błąd o przydziale pamięci.
Cytat
Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes) in /var/www/html/index.php on line 33


Zresztą sami spójrzcie:
  1. $ap = array ('V1', 'V2', 'JM1', 'JM2' );
  2.  
  3. for ($i=(count($ap)+1); $i<(count($ap)+15); $i++)
  4. {
  5. $ap[$i]="GM $i"; //to jest właśnie linia 33
  6. }

Jak widać w momencie wystapienia błedu skrypt próbuje dopisac do zmiennej tablicowej $ap (zawierającej aktualnie 4 rekordy) koloejne 15 rekordów. Nie sadze, żeby 19 rekordów przekraczało 134217728 bajtów (czyli 128 MB), zresztą po zmianie w php.ini
Kod
memory_limit = 128M
na
Kod
memory_limit = 512M
wyskakuje identyczny błąd (zmienia się tylko ilość dozwolonej pamięci zmienia się na 536870912).

Włączenie obsługi długich tablic
Kod
register_long_arrays = On
też nie pomaga - zresztą 19 rekordów to nie jest długa tablica.

Jestem prawie pewien, ze to kwestia konfiguracji apach'a, ale nie mam pomysłu co konkretnie mogłoby to powodować.

A może coś z uprawnieniami do katalogu/plików?

Jesli ktos ma jakis pomysł to bardzo prosze pomoc / podpowieedź.

Z góry dzięki.

Pozdrawiam
Fifi209
A skąd się zabrała tam tablica: $apartments i jakie przyjęła wartości?
-=Peter=-
Wydaje mi się, że w pętli modyfikujesz (zwiększasz) tablicę apartments, a to że za każdym razem wywoływany jest count($apartments) powoduje że pętla wykonuje się masakryczną liczbę razy do momentu aż pamięci brakuje. Wyciągnij liczenie elementów tablicy $apartments przed pętle i przypisz do zmiennej, którą wstawisz w miejsca, gdzie obecnie wywołujesz funkcję count.
Pilsener
I nie przechowujemy dużej liczby danych w pamięci, używamy plików lub bazy.
DK.log
Cytat(fifi209 @ 19.10.2010, 20:21:03 ) *
A skąd się zabrała tam tablica: $apartments i jakie przyjęła wartości?

Tablica $apartments miała być tablicą $ap - przepraszam za pomyłke. Już wyedytowałem pierwszy post.

Cytat(-=Peter=- @ 19.10.2010, 20:28:32 ) *
Wydaje mi się, że w pętli modyfikujesz (zwiększasz) tablicę apartments, a to że za każdym razem wywoływany jest count($apartments) powoduje że pętla wykonuje się masakryczną liczbę razy do momentu aż pamięci brakuje. Wyciągnij liczenie elementów tablicy $apartments przed pętle i przypisz do zmiennej, którą wstawisz w miejsca, gdzie obecnie wywołujesz funkcję count.


-=Peter=- miałes rację.

Wystarczyła prosta zmiana.
  1. $ap = array ('V1', 'V2', 'JM1', 'JM2' );
  2. $k=count($ap);
  3. for ($i=($k+1); $i<($k+15); $i++)
  4. {
  5. $ap[$i]="GM $i"; //to jest właśnie linia 33
  6. }


Dzięki.


Cytat(Pilsener @ 19.10.2010, 22:36:16 ) *
I nie przechowujemy dużej liczby danych w pamięci, używamy plików lub bazy.


Pilsener, zgadzam sie z tobą. Zwróć jednak uwage, że z załozenia "moja" ilośc danych to miało byc 34 rekordy. Przez moją pomyłke w definicji petli for danych zrobiło się o wiele więcej.

W kazdym razem dziękuje wszytskim za zainteresowanie tematem.
Poniewaz problem został rozwiazany przez -=Peter=-'a, mozemy śmiało zamykac ten temat.

Pozdrawiam.


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.