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.
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 –
«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
Czy jesteś w 100% pewien, że system operacyjny ma więcej niż 300 MB wolnej pamięci do przydzielenia? – DaveRandom