Ограничение памяти heroku php

Эта статья на Heroku утверждает, что 128 МБ должно быть достаточно для большинства приложений PHP. Я воспринимаю это как смелое заявление, глядя на композитор, который увеличивает лимит памяти до 1,5 ГБ при запуске.

В частности, мы сталкиваемся с проблемами при создании PDF-файлов или обработке экспорта больших баз данных. Думаю, здесь я упускаю какую-то передовую практику. Как нам решать задачи, требующие интенсивного использования памяти на Heroku?

Одним из способов добиться этого, вероятно, было бы написать .user.ini, чтобы увеличить лимит памяти. Но я думаю, это считается плохой практикой.

Composer работает в интерфейсе командной строки, поэтому нет никаких реальных шансов, что у вас есть 10 одновременных пользователей, все выполняющие команды composer. Обычно все задачи, которым требуется много памяти, могут быть записаны как задачи командной строки, которые будут запускаться в асинхронной очереди или по расписанию, чтобы гарантировать, что вы не получите много одновременных операций с интенсивным использованием памяти, выполняемых одновременно.

apokryfos 10.08.2018 16:38
«128 МБ должно быть достаточно для большинства приложений PHP» - Я бы сказал, что «большинство приложений PHP» не создают PDF-файлы и не обрабатывают экспорт больших баз данных.
Sean Bright 10.08.2018 16:42

@SeanBright Я думаю, что создание файлов PDF с помощью PHP - обычное дело. Подумайте, например, о счетах.

Chrisissorry 10.08.2018 20:16

@Chrisissorry У меня нет доказательств, подтверждающих это, но моя интуиция подсказывает мне, что "большинство приложений PHP" - простые приложения CRUD. В любом случае это не ответ на ваш вопрос.

Sean Bright 10.08.2018 23:04
0
4
1 573
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

(раскрытие - я работаю в команде поддержки Heroku)

Heroku - это платформа, которая обрабатывает широкий спектр приложений - им нужен баланс между максимальной эффективностью (для приложений, использующих много параллелизма) и достаточным запасом для общих задач обработки. Это означало, что было выбрано 128 МБ на основе опыта команды PHP. (см. https://devcenter.heroku.com/articles/php-concurrency#determining-a-suitable-memory-limit)

Ваш пример о композиторе, использующем 1,5 ГБ, интересен, но стоит иметь в виду, что такие задачи, как разрешение зависимостей и выполнение шагов сборки (которые выполняет Composer), имеют совершенно другой профиль, чем обслуживание веб-запросов. Если вы занимаетесь чем-то интенсивным, например, обрабатываете PDF-файлы, в идеале это должно быть передано в фоновый процесс, чтобы запрос был как можно более легким. Для этого подойдет любая фоновая система очередей, но вот один пример https://devcenter.heroku.com/articles/php-workers

Тем не менее, один размер определенно не подходит для всех, и при необходимости вполне можно изменить значения по умолчанию.

Для этого есть несколько вариантов, большинство из которых описано здесь: https://devcenter.heroku.com/articles/php-concurrency#tuning-concurrency-using-memory_limit

Файл .user.ini - это один из вариантов, однако он может действовать для отдельных каталогов, что может вызвать некоторую путаницу при работе с командами.

Вы также можете настроить это на уровне PHP-FPM, используя собственный файл конфигурации с таким содержимым:

php_value[memory_limit] = 64M

Чтобы эти настройки вступили в силу, вам необходимо использовать опцию -F в вашей команде Procfile, чтобы загрузилась конфигурация:

web: vendor/bin/heroku-php-apache2 -F fpm_custom.conf

Существуют аналогичные параметры конфигурации для Nginx и HHVM, описанные в указанной статье.

Чтобы добавить ответ @ xavriley, если у вас нет Procfile, потому что вы просто запускаете свои развертывания с git push heroku master, вам необходимо создать его в своем корневая директория.

Создайте файл с именем Procfile, содержащий следующее:

web: vendor/bin/heroku-php-apache2 -F fpm_custom.conf

Если файл fpm_custom.conf существует по тому же пути, что и файл Procfile. Файл fpm_custom.conf должен содержать желаемый размер memory_size:

php_value[memory_limit] = 256M

После создания этих файлов, фиксации, отправки и повторного запуска git push heroku master в журналах развертывания должен отображаться новый запущенный файл Procfile.

Другие вопросы по теме