Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: php://input i problem z pamięcią
Forum PHP.pl > Forum > PHP
Sephirus
Witam,

Od razu przechodzę do rzeczy.

Mam skrypt, na który przesyłane są spore rozmiarami dane w formie RAW POST. Skrypt odbiera te dane poprzez pointer do php://input, zczytuje je i procesuje. Wszystko fajnie działa. Okazuje się jednak, że są spore problemy z pamięcią. Dokładnie rzecz ujmując:

Po przesłaniu na skrypt 1MB danych, od razu po jego załadowaniu (zaraz po <?php) zużycie pamięci sięga ~2MB (~1MB wymaga samo PHP), dodatkowo PIK pamięci wynosi ~4MB. Dane nie są jeszcze wczytane przez skrypt więc po ich zaczytaniu pamięć wzrasta do jakichś ~3MB (1MB więcej co jest logiczne).

Problemem jest to, że właśnie już na wstępie PHP zajmuje sobie pamięć na to co ma w php://input a nawet coś konkretnego z tym robi i to (wg moich wyliczeń) robi coś z tym 3 razy (PIK:4MB - 1MB na PHP co daje 3MB czyli potrójny rozmiar przesłanych danych). Liczby przedstawione przeze mnie są przykładowe ale przesyłanie danych o innych wielkościach skutkuje dokładnie tym samym (zawsze PHP zajmują pamięć na to a PIK wynosi 1MB + 3 x rozmiar danych).

Sprawdziłem wszystkie możliwe zmienne, opcja ALWAYS_POPULATE_RAW_POST*** jest wyłączona. Mimo to nic nie mogę zrobić z tą pamięcią.

Problem jest dość istotny bo przy założeniu, że dam ograniczenie pamięci na powiedzmy 64MB to już przesłanie 25MB wykrzacza skrypt (PIK wynosi ponad 75MB pamięci).

Szukam jednego z dwóch rozwiązań:
1. Czy da się coś zrobić by skrypt PHP nie zajmował tej pamięci już na samym starcie?
2. Jeśli nie - to czy można ją jakoś zwolnić (do samego końca skryptu jest ona zajęta).

Próbowałem kombinować z GC itp ale nic to nie daje.

Ma ktoś jakiś pomysł? Spotkał się z czymś podobnym? Każda wskazówka może być pomocna - dzięki!
CuteOne
Hmm a próbowałeś cachować dane już na starcie? http://stackoverflow.com/a/6106217
Sephirus
Dzięki za odpowiedź ale to nic nie daje sad.gif - problemem nie jest tu wielkość samych danych bo można je czytać po kawałku ale to że PHP je trzyma gdzieś w pamięci i ta pamięć zajmuje pamięć samego skryptu :/

Nawet kopiując stream do streama (z php://input do jakiegoś pliku) czyli praktycznie bez zużycia pamięci przez skrypt ma on już na starcie PIK pamieci w wysokości 1 + 3x[rozmiar danych] - co tak jak pisałem przy danych 25MB i LIMIT na 64M daje FATAL ERROR o przekroczeniu pamięci jak tylko odpala się skrypt :/
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.