2012-01-31 3 views
5

Я пытаюсь увеличить разрешенную память для определенного PHP-скрипта. Независимо от того, что я делаю, например, это:PHP не может использовать 300 МБ ОЗУ

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

... скрипт всегда выполняется из памяти около 300Мб:

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

Я аттестованы несколько означает, что memory_limit на самом деле изменилось , Проблема заключается в том, что PHP не может физически выделить в общей сложности 300   МБ памяти (25165824   байт + 343810589   байт = 352   МБ).

Я пытался как PHP/5.3.0 и PHP/5.3.9 в двух разных компьютерах на базе Windows со следующими спецификациями:

  • Windows XP/Windows Server 2003 (оба компьютера являются 32- битных коробки с 1 Гб или RAM)
  • Официальные PHP 32-разрядные VC9 двоичные файлы
  • Запуск в Apache 2.2 модуль (третьей стороны 32-разрядных VC9 двоичных файлов)

Я понимаю, что использование половины физической памяти заставит swa pping и медленные вещи, как черт, но мне просто нужно убедиться, что скрипт работает, поэтому его можно развернуть на живой сервер. Я также пробовал более крупные значения (которые выдавали ту же ошибку) и меньшие значения (с тем, что мой скрипт достиг предела или сделал сбой Apache).

Что может быть источником этого явно жесткого ограничения памяти?

Обновление № 1: Я провел дополнительные испытания с помощью окна Windows Server 2003 (который фактически является виртуальной машиной VMWare). Я увеличил «физическую» оперативную память до 2   ГБ, и я подтвердил, что файлу подкачки разрешено вырасти до 1152   МБ. Диспетчер задач показывает, что текущая транзакционная нагрузка составляет 886   МБ, и имеется 1,5   ГБ свободной физической памяти. Тем не менее, я получаю ту же ошибку с точно такими же цифрами.

Обновление № 2: Как я уже говорил, директива memory_limit в порядке. Он отображается как в ini_get(), так и в phpinfo(). Сообщение об ошибке, которое вы получите, немного отличается от моего; my указывает на ошибку PHP . Пожалуйста, сравните:

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

Я попытаюсь составить сценарий для воспроизведения проблемы и отчета.

+0

Если PHP пытается захватить столько памяти за один раз, то я предполагаю, что вы пытаетесь загрузить файл ... попробуйте загрузить файл в кусках, а не за один раз –

+0

«Если вы не можете оптимизировать , купите больше ОЗУ ... »Ну, некоторое время это неправильно ...;) Вы уверены, что вам нужна вся эта память? 300MB уже огромная сумма. Возможно, вы можете немного оптимизировать свой скрипт ... – Macmade

+2

Вы на 100% уверены, что ОС имеет более 300 МБ свободной памяти? – DaveRandom

ответ

4

Исключение OOM отличается от ограничений предупреждения памяти.

Это означает, что PHP не может фактически выделить память, поскольку в вашей операционной системе доступно недостаточно ресурсов.

Вам необходимо проверить наличие достаточного объема памяти/пейджинга для поддержки этого устройства.

+0

Я обновил вопрос. На сервере, по-видимому, достаточно памяти. –

0

Попробуйте с max_input_time, иногда, когда PHP говорит memory_limit это на самом деле означает max_input_time (-1 бесконечна для этого).

+0

Хорошая точка. Но значение уже установлено на 20 минут, и авария происходит раньше. Я не работал над этим, так как я задал этот вопрос, но я знаю, что рано или поздно мне нужно будет исправить код, чтобы он не нуждался в такой большой памяти. –

+0

Ухмм, тогда я больше не могу помочь! – R01010010

Смежные вопросы