2012-01-31 17 views
5

Próbuję zwiększyć dozwoloną pamięć dla określonego skryptu PHP. Bez względu na to, co robię, na przykład tak:PHP nie może używać 300 MB pamięci RAM

ini_set('memory_limit', '512M'); 

... skrypt zawsze zabraknie pamięci na około 300MB:

Fatal error: Out of memory (allocated 25165824) (tried to allocate 343810589 bytes) in \\Foo\phpQuery\phpQuery.php on line 255 

I zostały zweryfikowane przez kilka oznacza, że ​​memory_limit faktycznie zmienił . Problem wydaje się, że PHP nie może fizycznie przydzielić łącznie 300   MB pamięci (25165824   bajtów + 343810589   bajtów = 352   MB).

Próbowałem zarówno PHP/5.3.0 i PHP/5.3.9 w dwóch różnych komputerach opartych na systemie Windows z następującymi specyfikacjami:

  • Windows XP/Windows Server 2003 (oba komputery są 32- skrzynki bitowej z 1GB lub RAM)
  • oficjalne PHP 32-bitowe binarne VC9
  • Uruchamianie jako Apache 2.2 modułu (trzeciej partii 32-bitowej binarnej dystrybucji VC9)

I zrozumieć, że przy połowie pamięci RAM zmusi swa Ping i powolne rzeczy jak cholera, ale po prostu muszę się upewnić, że skrypt faktycznie działa, aby mógł zostać wdrożony na serwerze na żywo. Próbowałem również większych wartości (które wypróbowywały ten sam błąd) i mniejszych wartości (albo spowodowały, że mój skrypt osiągnął limit lub spowodował awarię Apache).

Co może być źródłem tego najwyraźniej zakodowanego limitu pamięci?

Aktualizacja # 1: Zrobiłem dalsze testy z pudełkiem Windows Server 2003 (w rzeczywistości jest to maszyna wirtualna VMWare). Zwiększyłem "fizyczną" pamięć RAM do 2   GB i sprawdziłem, że plik stronicowania może wzrosnąć do 1152   MB. Menedżer zadań pokazuje, że bieżące obciążenie transakcji wynosi 886   MB i jest 1,5   GB wolnej pamięci fizycznej. Jednak otrzymuję ten sam błąd z dokładnie takimi samymi liczbami.

Aktualizacja # 2: Jak już powiedziałem, dyrektywa memory_limit jest w porządku. Pojawia się w obu ini_get() i phpinfo(). Komunikat o błędzie, który otrzymasz, jest nieco inny niż mój; mój wskazuje awarię PHP . Proszę porównać:

Out of memory (allocated 25165824) (tried to allocate 343810589 bytes) 
Allowed memory size of 25165824 bytes exhausted (tried to allocate 343810589 bytes) 

Postaram się skomponować skrypt, aby odtworzyć problem i złożyć raport.

+0

Jeśli PHP próbuje pobrać tyle pamięci za jednym zamachem, to zakładam, że próbujesz załadować plik ... spróbuj załadować plik w porcjach, a nie jednym razem –

+0

«Jeśli nie możesz zoptymalizować , kup więcej RAM ... »Cóż, trochę czasu to źle ...; Czy jesteś pewien, że potrzebujesz całej tej pamięci? 300 MB to już ogromna ilość. Może możesz zoptymalizować skrypt nieco ... – Macmade

+2

Czy jesteś w 100% pewien, że system operacyjny ma więcej niż 300 MB wolnej pamięci do przydzielenia? – DaveRandom

Odpowiedz

4

Wyjątek OOM jest inny niż warninigs z limitem pamięci.

Oznacza to, że PHP nie może faktycznie przydzielić pamięci, ponieważ w systemie operacyjnym nie ma wystarczających zasobów.

Należy sprawdzić, czy w systemie dostępna jest wystarczająca ilość pamięci/stronicowania do obsługi tego.

+0

Zaktualizowałem pytanie. Serwer najwyraźniej ma dość pamięci. –

0

Spróbuj z max_input_time, czasami gdy PHP mówi memory_limit to faktycznie oznacza max_input_time (-1 jest nieskończona dla tego jednego).

+0

Dobra uwaga. Ale wartość jest już ustawiona na 20 minut, a awaria nastąpi wcześniej. Nie pracowałem nad tym, ponieważ zadałem pytanie, ale wiem, że prędzej czy później będę musiał naprawić kod, aby w pierwszej kolejności nie potrzebował tak dużo pamięci. –

+0

Uhmm, więc nie mogę pomóc, już przepraszam! – R01010010