apache — PHP не хватает памяти с фатальной ошибкой: допустимый объем памяти X байтов исчерпан (попытался выделить Y байтов)

Я занят переносом клиентского приложения, написанного на PHP / MySQL, из Hetzner в AWS. Все отлично работает, но несколько скриптов. Эти сценарии плохо написаны и проходят через миллионы записей, создавая сотни локальных переменных при каждом запуске цикла, записывая каждую строку в файл Excel, открывая другой файл, записывая обновление статуса и закрывая файл при каждом запуске цикла , Сценарий порождается как независимый процесс с использованием shell_exec из основного веб-приложения.

Когда я впервые протестировал скрипт на EC2, он довольно быстро зависал, как php memory_limit параметр был установлен в 128M на моем экземпляре EC2. Ошибка была похожа на приведенную ниже:

Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes)

Я увеличил memory_limit от 128M в 256Mзатем 512Mзатем 1024M, 4096M и в конечном итоге установить -1 чтобы увидеть, в чем проблема.

Установка его в -1 Сначала казалось, что он работает, но затем заморозил весь экземпляр (t2.micro). Затем я понял, что из-за недостатка пространства подкачки пределы системной памяти достигаются, поэтому для целей тестирования я добавил пространство подкачки: 4GB и установить memory_limit в -1, Это сработало, как и ожидалось, и скрипт никогда не падал, но по мере его запуска он становился все медленнее Например, он записал первые 10% записей в файл Excel намного быстрее, чем 10% после 50%. Все это время я наблюдал, как увеличивается объем используемой памяти до 6 ГБ.

Ниже приведены скриншоты из htop во время работы скрипта:

введите описание изображения здесь

введите описание изображения здесь

Я использую по умолчанию php.ini что идет установка php кроме memory_limit который установлен в -1.

Тем не менее, когда я запускаю это очень тот же сценарий на другом сервере (в данном случае это общий хостинг Hetzner), сервер каким-то образом ограничивает использование памяти и сценарий работает нормально 128M из memory_limit установка. Хотя это не совсем верно (что подтверждается htop на сервере), похоже, что он не падает на сервере с гораздо меньшим объемом памяти / места подкачки, чем на моем экземпляре EC2.

Ниже приведены скриншоты из htop работает на Хецнера:

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Третий снимок экрана был сделан ближе к концу сценария — и, как вы можете видеть, память мало изменилась между началом и концом. Вот php.ini Настройки с сервера:

display_errors=1
memory_limit=128M
max_execution_time=90
max_input_vars=3500
upload_max_filesize=64M
post_max_size=64M
allow_url_fopen=0

База данных и кодовая база являются точными копиями в обоих случаях. Результирующий размер файла Excel составляет около 225 МБ в обоих случаях.

Итак, есть идеи, что может быть причиной такого поведения и как мне исправить его на моем экземпляре EC2?

Спасибо за помощь!

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …