У меня есть веб-приложение, написанное на PHP
с базой данных MySQL
. Это оптимизированная и эффективная структура. Он существует уже более 5 лет, каждый день пользователи регистрируются и/или вносят свой вклад в расширение единой базы данных, которая всегда больше.
Что происходит уже около 15 дней, так это то, что 1 или 2 раза в день возникает ошибка
PHP Fatal error: Out of memory (allocated X (tried to allocated Y bytes)
У меня есть виртуальный хостинг, для memory_limit
установлено значение 512 МБ.
База, скачанная через бэкап (.sql
), весит около 750Мб, но на диске места больше 1Гб.
Может размер базы влияет? Или это потому, что так много запросов, которые создают критические условия для сервера?
У вас есть какие-нибудь предложения для меня?
Убедитесь, что вы получаете только те данные, которые вам нужны. Большая таблица может генерировать эту ошибку, если вы получаете все записи в этой таблице.
Эта ошибка (напрямую) не связана с размером вашего база данных. Это говорит о том, что во время работы вашего PHP, вы создали переменные, которые занимают между собой более 512 МБ. Например, while(true) { $a[] = 'hello'; }
теоретически может создать столько копий hello
в памяти, что вы получите эту ошибку без какой-либо базы данных. Таким образом, этот вопрос не имеет ответа с предоставленной информацией.
Это сообщение об ошибке должно содержать номер строки. Есть ли какая-либо конкретная причина, по которой вы почувствовали необходимость опустить номер строки и решили не указывать код, который находится под этим номером строки.
@MonkeyZeus Справедливости ради следует отметить, что в случае ошибок нехватки памяти вопрос удачи показывает ли номер строки вам что-нибудь полезное. Если вы выделите 511,999 МБ в одной функции, а затем попытаетесь выделить несколько байт в другом месте, ошибка ничего не скажет вам о том, куда делись 511,999 МБ.
Я работал постоянно 5 лет, уделяя внимание улучшению запросов MySQL. В начале, когда база данных была небольшой, мне не приходилось сталкиваться с проблемами производительности. Потом, запрос за запросом, анализ за анализом, я многое понял и применил: поэтому всегда сокращал объемы извлекаемых данных, различные cron-сервисы, которые регулярно генерируют какие-то кэш-файлы, чтобы избежать очень сложных и частых запросов. Тем не менее, есть один тип запроса, который, я думаю, мне нужно лучше проверить и понять, может ли этот тип запроса быть проблемой.
Судя по всему на моем пк нет проблем запустить приложение с memory_limit=128 Мб, я мог бы и с меньшими лимитами попробовать. Итак, я хотел бы знать, учитывает ли memory_limit одиночный запрос или он является кумулятивным, и поэтому многие подключенные пользователи способствуют достижению 512 МБ? Честно не знаю.
После нескольких дней замедлений, при которых часто возникали такие ошибки, как
Неустранимая ошибка PHP: недостаточно памяти
Mysql слишком много подключений
Не удается подключиться к локальному серверу MySQL через сокет «/tmp/mysql.sock»
Я связался с техподдержкой и мне сказали что идет DDoS атака
Зависит от того, сколько данных вы извлекаете из БД сразу - например. если вы назначаете все записи из таблицы переменной, то чем больше данных в таблице, тем больше памяти потребуется для этой переменной.