Фатальная ошибка разрешенный размер памяти 268435456 байт исчерпан
Эта ошибка появляется случайным образом, даже если сервер очень слабо загружен и не воспроизводится на локальном хосте. У меня есть сервер VPS 4 от hostgator с большим количеством МБ. Конфигурация php позволяет до 256 Мб.
В таблице tbl_bid 2800 записей. Я получаю ошибку исчерпания памяти в цикле while внутри функции func_select_array. Я не могу представить, что для этого запроса требуется 256M+. Проблема не в php, а в mysql. Пожалуйста помоги.
В какой именно строке вы получаете ошибку. И будьте уверены, что это связано с PHP, а не с MySQL. Если бы это был mysql, сервер не вернул бы результат. Но вы должны проверить, отправляете ли вы правильный запрос. - hakre
2800 записей, вероятно, в порядке. Каков размер каждой записи? Содержат ли они BLOB с? - Salman A
Первым делом нужно воссоздать ошибку. В противном случае, зарегистрируйте все. Если возможно, запишите запрос, результат mysql_num_rows() , memory_get_peak_usage() , и все остальное до того, как закончится память. Затем, когда это произойдет в следующий раз, вы сможете просмотреть запрос и количество записей, которые он пытался перебрать. Вы можете найти то, чего обычно не ожидаете. - Mike B
Вы уверены, что func_select_array не вызывается откуда-то еще? Или много раз по какой-то причине? - Ben
Вы делаете select * from tbl_bid это означает, что если есть поле с большим объемом данных (одно поле в MySQL может быть размером в терабайт), и вы запихиваете его в память PHP - ну, вы можете достичь предела. Это совершенно нормально и зависит от объема запрашиваемых данных. - hakre
Что вызывает фатальную ошибку ограничения памяти WordPress
Веб-серверы устанавливают ограничение на объем памяти. Ограничение памяти является необходимой функцией для защиты серверов. Веб-серверам требуется достаточно памяти для одновременного запуска многих приложений.
Если память, используемая PHP-скриптами, не ограничена, плохо написанный скрипт может использовать всю память. Это приведет к сбою сервера и сделает ваш сайт и все другие сайты на этом сервере недоступными.
Поскольку WordPress состоит из скриптов, написанных на PHP, он связан ограничениями памяти, установленными для PHP-скриптов.
Таким образом, если одному из ваших скриптов требуется больше памяти, чем может быть выделено, у него заканчивается память, и вы видите ошибку WordPress allowed memory size exhausted.
Когда это происходит, вы почти всегда можете проследить проблему до плагина или в некоторых случаях до темы. Маловероятно, что ваши основные скрипты WordPress потребуют больше, чем выделенная память для запуска.
Увеличение лимита памяти PHP в WordPress — простое решение
По дизайну WordPress сначала пытается увеличить ваш лимит памяти до 64 Мб. Появление этой ошибки указывает на то, что этого размера все еще недостаточно, или в некоторых случаях ваш сервер предотвращает выделение большего объема памяти.
Вы можете вручную увеличить лимит памяти в WordPress, отредактировав файл wp-config.
Для этого подключитесь к своему сайту с помощью FTP-клиента FileZilla.
При подключении папки и файлы вашего сайта будут отображаться в правом нижнем углу экрана. Найдите папку, содержащую все ваши файлы WordPress, и дважды щелкните ее, чтобы открыть.
В этой папке найдите файл wp-config, щелкните его правой кнопкой мыши и выберите команду просмотр/редактирование.
Когда файл откроется в текстовом редакторе, прокрутите его вниз, чтобы найти строку “That’s all, stop editing! Happy blogging.” Вставьте следующий код над этой строкой.
Сохраните этот файл и закройте редактор. FileZilla предложит вам загрузить отредактированный файл.
Теперь перезагрузите свой сайт. Проблема должна быть исправлена и ваш сайт должен отображаться правильно.
Настройка PHP
Нужно понимать то, что PHP имеет лимит памяти, а также то, что вы можете в некотором роде управлять им через WordPress. Обычно есть две вещи, которые нужно сделать, чтобы убедиться в том, что проблема решена в полном объеме.
Но сначала надо узнать, какую именно версию PHP вы используете. Если вы работаете с PHP на локальной машине, то вы, скорее всего, сможете найти версию PHP в панели управления своего веб-сервера:
В противном случае версия должна отображаться где-либо в пределах панели управления вашего хостинг-аккаунта.
Это даст нам понять, какой конфигурационный файл PHP нужно редактировать. В частности, вам нужно найти файл php.ini, который связан с вашей версией PHP.
Если у вас установлена только одна версия, прекрасно; иначе вам нужно будет найти файл php.ini для вашей определенной версии PHP, которая в данный момент запущена.
Альтернативное решение-найти скрипт, вызывающий ошибку
Исправление выше может помочь вам быстро избавиться от проблемы. Но бывают ситуации, когда лучше найти скрипт, требующий больше памяти, и удалить его.
Если, например, вам нужно увеличить выделенную память выше 256M, то этот скрипт уже занимает слишком много памяти. Это может испортить производительность вашего сайта.
В некоторых случаях ваш хост может вообще не разрешить вам увеличить объем памяти. В этом случае вы можете связаться с вашим хостом и попросить его увеличить объем памяти. Или еще лучше, вы можете отследить причину проблемы и избавиться от нее.
В первую очередь нужно проверить ваши плагины. Если вы установили плагин WordPress незадолго до возникновения этой ошибки, то в нем, скорее всего, причина.
Если отключение плагина не решает проблему, то возможно виновата ваша текущая активная тема.
Как удалить плагин и тему без доступа к админ панели узнайте в следующих статьях.
Хакер, желающий получить доступ к сайту WordPress с помощью грубой Read more
Аренда серверов — это популярная услуга по аренде места и Read more
С таким количеством функций и опций, доступных для WordPress, пользователи Read more
Таблицы и диаграммы — это отличные инструменты для подготовки и Read more
Доменное имя WordPress предоставляет собой средство поиска и идентификации сайта Read more
Добавление видеоконтента на ваш сайт может быть отличным способом привлечения Read more
Я поспрашивал, и мне сказали, что мне нужно увеличить memory_limit до значения выше 256M, поэтому я изменил его на 512M и все та же проблема. Затем я изменил его на 3024M, и это то, что у меня есть сейчас, но это не устранило проблему.
Ждем вашего ответа.
Похоже, изменение лимита памяти не применяется. Возможно, вы редактируете не тот файл. Попробуйте запустить php_info () в скрипте в том же каталоге, что и ваша установка WordPress, и проверьте вывод на предмет фактического memory_limit там.
ну, это не мой код, это кодировщик, которому я заплатил ему за создание всего сайта, и он сказал, что это не его код, это сервер, который я должен проверить
WordPress переопределяет ограничение памяти PHP до 256 МБ, предполагая, что все, что было установлено ранее, будет слишком низким для отображения панели инструментов. Вы можете переопределить это, указав WP_MAX_MEMORY_LIMIT в wp-config.php :
Я согласен с DanFromGermany, 256M - это действительно много памяти для рендеринга страницы панели инструментов. Изменение предела памяти действительно накладывает отпечаток на проблему.
Большое спасибо, Дэйв, это работает, но, пожалуйста, что это значит, в чем проблема, например, какова причина, которая приводит к этой проблеме, кодировщик или сервер?
Это зависит от того, что делает код, может быть законная причина для использования такого большого объема памяти, например, для обработки больших файлов, но даже для больших файлов, вместо того, чтобы читать все это в памяти, может быть способ ее обработать. кусками.
У меня была такая проблема. Я искал в Интернете, принимал все советы, менял конфигурации, но проблема все еще существует. Наконец, с помощью администратора сервера он обнаружил, что проблема заключается в определении столбца базы данных MySQL. один из столбцов в таблице был назначен для «Longtext», что приводит к выделению 4 294 967 295 байт памяти. Кажется, что все работает нормально, если вы не используете оператор подготовки MySqli, но как только вы используете оператор подготовки, он пытается выделить этот объем памяти. Я изменил тип столбца на Mediumtext, которому требуется 16 777 215 бит памяти. Проблема ушла. Надеюсь на эту помощь.
Я изменил ограничение памяти с .htaccess, и эта проблема была решена.
Я пытался просканировать свой веб-сайт с помощью одного из антивирусных плагинов, и у меня возникла эта проблема. Я увеличил объем памяти, вставив это в свой файл .htaccess в папке Wordpress:
После завершения сканирования я удалил эту линию, чтобы сохранить прежний размер.
У меня есть функция выключения, которая вызывается при появлении фатальной ошибки. Эта функция создает из него исключение ErrorException и регистрирует его.
Проблема в том, что когда доступной памяти больше нет, он не может зарегистрировать ошибку (я вхожу в Firebug через FirePHP с Zend Framework).
Существует еще один тип ошибок - «улавливаемая фатальная ошибка», которая, как следует из названия, может быть обнаружена с помощью попытки / улова, но, к сожалению, выделение размера памяти не входит в их число.
Можно ли расширить лимит памяти во время выполнения? (просто для того, чтобы получить достаточно памяти для завершения рендеринга сайта) Я полагаю, что невозможно перечислить все объекты в памяти и «убить» тот, который слишком большой, как я мог бы с процессами? (Я знаю, что это просит луну, но кто знает)
Не верьте так. Если с этой проблемой связана одна конкретная вещь, то вам, возможно, придется ее избежать и увеличить лимит памяти (для этого скрипта). Это не то, чего вы хотите, но я не верю, что у вас есть другой выбор.
Нет, не бойся. Просто из любопытства, какой у вас текущий лимит памяти и что это за веб-сайт? Я не уверен, что такое рекомендуемое количество, но я обычно устанавливаю его на 1/4 ОЗУ на машине. Возможно, в ключевых точках вашего скрипта вы могли бы вызвать memory_get_usage и, если он становится высоким, увеличивать значение memory_limit до того, как он сработает? Не уверен, не зная макета и цели вашего скрипта.
Я просто делю memory_get_usage на 1024 в квадрате, чтобы сравнить его с «нормальным» значением мегабайта, равным «70».
Я столкнулся с проблемами памяти с php внутри цикла for и написал этот простой оператор if, чтобы предотвратить фатальную ошибку в моем сценарии. Кроме того, сервер, на котором я работал, не позволял мне изменять лимит памяти (это часто имеет место в некоторых облачных предложениях, таких как openshift или крупных веб-хостах, таких как dreamhost). Я действительно не заметил серьезного снижения производительности ( в php 5.3, который может обрабатывать такие функции немного иначе, чем php 4.x или 5.x . в любом случае влияние на производительность скрипта, выдающего фатальную ошибку, перевешивает любые накладные расходы, которые может вызвать вызов функции. И также предотвратит убегающий скрипт от использования всей доступной оперативной памяти.
Многие могут поспорить; эй, ваше программное обеспечение не оптимизировано. да. Возможно ты прав; но со сложными наборами данных вы можете выжать только столько производительности, прежде чем вам понадобится больше памяти; и поиск ошибок памяти в потоке ajax может быть очень неприятным; особенно если вы не знаете, где находятся ваши файлы журналов.
отличный ответ! именно то, что я искал . должен был меньше сосредотачиваться на рассказе личной истории, а больше на реальном решении. Любопытно узнать, что вы положили в условное.
Обычный способ настройки обработки ошибок - через
set_error_handler - Устанавливает определяемую пользователем функцию обработчика ошибок
Документация для этого состояния функции ( выделено мной ):
The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.
Так что это не будет работать регулярно, но вы можете попробовать
Начиная с PHP7, ошибки и исключения являются метательными, поэтому вы можете попробовать / поймать их:
В произвольный момент времени любой разработчик, создающий тему или плагин, либо просто пользователь, работающий с WordPress, может столкнуться с ошибкой Fatal Error: Memory Exhausted (память исчерпана). Обычно эта ошибка выглядит следующим образом:
Fatal error: Allowed memory size is 268435456 bytes exhausted (tried to allocated 29596635 bytes) in …/wp-includes/wp-db.php on line 885.
По моему мнению, одна из самых заметных проблем с такими вот ошибками – это слишком быстрое нахождение решения в Google, ведь люди не стараются понять проблему.
Да, у нас под рукой всегда имеются материалы, которые прекрасно спасают в беде. Однако стоит помнить, что понимание проблемы помогает нам расширить свой багаж опыта, развивать и совершенствовать свой уровень.
В данной ситуации очень полезно разобраться с тем, почему возникла такая ошибка.
2 ответы
Нехватку памяти может быть очень сложно отладить, потому что ошибка сообщает вам только о том, где закончилась память, а не о том, где она была использована.
Вы можете использовать профилировщик памяти, такой как в Xdebug, чтобы найти, куда делась вся эта память.
ответ дан 24 апр.
Вы должны использовать EXPLAIN для вашего запроса. Чтобы убедиться, что вы не выполняете какой-то тяжелый запрос (на первый взгляд не кажется).
Во-вторых, возможно, вы получаете слишком тяжелое поле BLOB или TEXT. Не у вас на месте, поэтому вы не можете получить это в местной среде.
Убедитесь, что вы не получаете бесконечный цикл. Может быть?
Используйте трассировку ошибок php и попробуйте/перехватите этот блок, чтобы получить более точную информацию об ошибке.
ответ дан 25 апр.
Привет. Запрос не большой. В таблице 11 столбцов (5 int, 4 varchars (255), 1 datetime и 1 double). Я не думаю, что попадаю в бесконечный цикл, потому что этот запрос большую часть времени работает нормально. Ошибка памяти появляется случайно. Также в вызывающей функции я ограничиваю количество строк до 10. Итак, как может возникнуть проблема, если все время повторяются только 10 строк, независимо от количества записей в таблице? Не могли бы вы сказать мне, как я могу поставить try catch & log, какой запрос вызвал ошибку памяти? - Анита
Кроме того, вы можете распечатать свой запрос, чтобы увидеть, нет ли где-нибудь чего-то странного. - онтананза
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками php mysql fatal-error or задайте свой вопрос.
Ваш сайт WordPress нуждается в компьютерной памяти для работы. Иногда выделенной памяти может быть недостаточно для запуска вашего сайта, и вы увидите такую ошибку ограничения памяти WordPress:
fatal error: allowed memory size of 67108864 bytes exhausted
Вторая ошибка, указывающая на нехватку памяти в WordPress, — это белый «экран смерти». Если ваш сайт не работает, и все, что вы видите, это белый экран, у WordPress заканчивается память.
Переводим байты в мегабайты
Первое, что мы сделаем – это переведем байты в мегабайты. Сделать это можно, к примеру, с помощью Google — достаточно ввести в поисковую строку следующий текст:
268435456 bytes to megabytes
В итоге мы получим результат:
Очень удобно. Но что нам делать с этой информацией?
Во-первых, мы должны понимать, что у нас есть предел в 256 Mb памяти, которая доступна для использования в WordPress и PHP, и этой памяти не хватает для совершения операций.
Честно говоря, ограничения нужно выставлять для PHP, однако я буду работать с WordPress, поскольку часть решения проблемы может включать в себя определение новой константы. Однако об этом – через одно мгновение.
Несколько слов о выделении памяти
Хочу сказать еще пару слов о выделении памяти. Несмотря на то, что самое простое решение – это увеличить доступную память, его не обязательно нужно делать в самом начале.
Фактически, я прибегаю к нему уже под конец, когда ничего не помогает.
Зачастую эта проблема является результатом работы какого-либо фрагмента кода, процедуры или определенного алгоритма – все это можно усовершенствовать и оптимизировать.
Таким образом, обязательно проверьте ваш код – используйте различные инструменты отладки и тестирования, чтобы исключить неэффективные участки. Если таковых нет, то тогда уже можно прибегать к корректировке памяти.
Увеличиваем лимит памяти
Как только вы найдете файл php.ini, взгляните на директиву memory_limit.
На скриншоте выше можно видеть, что лимит памяти установлен в 25 Mb, что явно меньше требуемого нам. Потому нам понадобится увеличить его до, скажем, 128 Mb, после чего перезапустить сервер.
Что делать, если WordPress по-прежнему жалуется на ошибку?
В данном случае вам, возможно, понадобится внести одно дополнительное изменение в файл wp-config.php. Есть две константы, которые мы можем определить:
- WP_MEMORY_LIMIT
- WP_MAX_MEMORY_LIMIT
Узнать подробнее про них можно в кодексе. Как показывает мой опыт, удобнее всего определить сразу две константы, чем одну WP_MEMORY_LIMIT.
Я упомянул это, потому что в сети ходят советы, согласно которым можно просто задать WP_MEMORY_LIMIT. Я не говорю, что это неправильно – просто у меня были наилучшие результаты, когда были определены обе константы.
По аналогии с php.ini, добавляем в wp-config.php следующие значения:
Это должно решить проблему.
Также можно задать следующее правило в .htaccess:
Ошибка нехватки памяти в WordPress
Нам гораздо удобнее оперировать мегабайтами, гигабайтами и терабайтами (хотя если у вас такой объем памяти, и вы столкнулись с указанной ошибкой, то это – совсем другая история).
Читайте также: