Недостаточно памяти для запуска вашего скрипта. PHP достиг предела памяти и перестает его выполнять. Эта ошибка является фатальной, сценарий останавливается. Значение предела памяти можно настроить либо в файле php.ini
, либо с помощью ini_set('memory_limit', '128 M');
в скрипте (который перезапишет значение, определенное в php.ini
). Цель ограничения памяти заключается в том, чтобы не допустить, чтобы один скрипт PHP собирал всю доступную память и приводил к остановке всего веб-сервера.
Первое, что нужно сделать, это свести к минимуму объем памяти, необходимый вашему сценарию , Например, если вы читаете большой файл в переменной или извлекаете много записей из базы данных и сохраняете их все в массиве, которые могут использовать много памяти. Измените свой код, чтобы вместо этого читать строки по строке или извлекать записи базы данных по одному, не сохраняя их все в памяти. Это требует немного концептуального понимания того, что происходит за кулисами, и когда данные хранятся в памяти и в других местах.
Если эта ошибка возникла, когда ваш сценарий не выполнял интенсивную работу с памятью, вы вам нужно проверить свой код, чтобы узнать, есть ли утечка памяти. Функция memory_get_usage
является вашим другом.
Вопросы, относящиеся:
Короткий ответ - то, что нет никакого "точного" значения, потому что это - новый термин, и различные люди используют его по-другому. То, что много, по крайней мере, может быть различено из статьи Wikipedia. Существуют некоторые, кто настаивает, что это только относится к коду "во время выполнения" (встроенные классы, я предполагаю), в то время как некоторые использовали бы его для обращения к модификации во время выполнения любого класса.
Лично, я предпочитаю более содержащее определение. В конце концов, если бы мы должны были использовать термин для модификации встроенных классов только, как мы обратились бы к модификации во время выполнения всех других классов? Важная вещь мне состоит в том, что существует различие между исходным кодом и фактическим рабочим классом.
В Ruby, патч обезьяны термина был неправильно понят для значения любой динамической модификации для класса и часто используется в качестве синонима для того, чтобы динамично изменить любой класс во времени выполнения.
вышеупомянутый оператор утверждает, что использование Ruby является неправильным - но условия развиваются, и это - не всегда плохая вещь.
Исправление обезьяны состоит в том, когда Вы замена методы класса во времени выполнения ( не добавляющие новые методы, поскольку другие описали).
В дополнение к тому, чтобы быть очень неочевидным и трудным для отладки способа изменить код это не масштабируется; поскольку все больше модулей запускает методы исправления обезьяны, вероятность изменений, топчущих друг друга, растут.
Вы корректны; это - когда Вы изменяете или расширяете существующий класс, а не разделяете его на подклассы.
Это - исправление обезьяны:
class Float
def self.times(&block)
self.to_i.times { |i| yield(i) }
remainder = self - self.to_i
yield(remainder) if remainder > 0.0
end
end
Теперь я предполагаю, что это могло бы иногда быть полезно, но вообразить, видели ли Вы стандартную программу.
def my_method(my_special_number)
sum = 0
my_special_number.times { |num| sum << some_val ** num }
sum
end
И это повреждается [только 116] иногда , когда это называют. Тем, которые обращают внимание, Вы уже знаете, почему, но предполагают, что Вы не знали о типе плавающем, имеющем .times
метод класса, и Вы автоматически предположили, что my_special_number
целое число. Каждый раз, когда параметр является целым числом, целым числом или плаванием, это хорошо работало бы (целые ints пасуются назад кроме тех случаев, когда существует остаток с плавающей точкой). Но передайте число с чем-либо в десятичной области в, и она повредится наверняка!
Просто воображают, как часто это могло бы произойти с Вашими драгоценными камнями, плагинами направляющих, и даже Вашими собственными коллегами в Ваших проектах. Если существуют один или два небольших метода там как это, и это могло бы занять время, чтобы найти и исправить.
, Если Вы задаетесь вопросом, почему это повреждается, обратите внимание, что sum
целое число, и остаток с плавающей точкой мог пасоваться назад; кроме того, экспоненциальный знак только работает, когда типы являются тем же. Таким образом, Вы могли бы думать, что это фиксируется, потому что Вы преобразовали числа беспокойства в плавания... только, чтобы найти, что сумма не может взять результат с плавающей точкой.
В Python monkeypatching назван много знаком затруднения: "У меня был к monkeypatch этот класс потому что..." (Я встретился с ним сначала при контакте с Zope, который статья упоминает). Это используется, чтобы сказать, что было необходимо захватить восходящий класс и зафиксировать его во времени выполнения вместо того, чтобы лоббировать, чтобы зафиксировать нежелательные поведения в фактическом классе или фиксировать их в подклассе. По моему опыту, люди Ruby не говорят о monkeypatching так очень, потому что это не считают особенно плохим или даже примечательным (следовательно "утиная перфорация"). Очевидно, необходимо быть осторожны относительно изменения возвращаемых значений метода, который будет использоваться в других зависимостях, но добавляющие методы к классу способ, которым делают active_support и фасеты, совершенно безопасны.
Обновление 10 лет спустя : Я исправил бы последнее предложение для высказывания, "относительно безопасно". Расширение класса оперативной библиотеки с новыми методами может привести к проблемам, если кто-то еще получает ту же идею и добавляет тот же метод с различной реализацией или сигнатурой метода, или если люди путают расширенные методы для функциональности базового языка. Оба случая часто происходят в Ruby (особенно относительно active_support методов).
Обычно это предназначено о специальных изменениях, с помощью Ruby открытые классы, часто с низкокачественным кодом.
Хорошее продолжение на предмете:
http://www.infoq.com/articles/ruby-open-classes-monkeypatching