Запуск PHP версии 7.1.30 под RHEL 7.7.
Я хочу поднять memory_limit, но не был уверен, что у меня был правильный синтаксис (то есть 256M или 256MB). Поэтому для начала я поставил неверное значение "Hugo" в качестве параметра memory_limit. Проблема в том, что phpinfo () (работает под httpd) буквально содержит строку "Hugo", т.е.
Так что это меня несколько беспокоит, что PHP на самом деле не проверяет правильность значений. (Если предоставленное значение было плохим, я бы ожидал, что оно вернется к значению по умолчанию, например)
Может кто-нибудь прокомментировать это - в частности, как вы узнаете, будет ли PHP обеспечивать выполнение вещей (если может быть предоставлена произвольная строка).
(int) 'HUGO'; // => 0
. Который начинает отказывать на моей машине на 2 МБ используемой памяти.memory_limit 256M
.Ответы:
Смущает то, что настройка выглядит как целое число с некоторым специальным синтаксисом, но внутренне определяется как строка. Затем строка анализируется в отдельной глобальной переменной при каждом изменении значения. Важно отметить, что результат разбора строки на целое число не сохраняется обратно в таблицу настроек, поэтому при вызове
phpinfo()
вы видите исходный ввод, а не проанализированное значение.Вы можете увидеть это в источнике:
zend_atol
, которая обрабатывает специальные суффиксыВ конечном итоге поддерживаемый синтаксис определен в
zend_atol
:g
,G
,m
,M
,k
, илиK
Значение без цифр в начале будет проанализировано как ноль. При установке глобальной переменной это установит предел памяти на минимально допустимый, основанный на константе
ZEND_MM_CHUNK_SIZE
.Вы можете увидеть эффект, установив предел памяти, затем запустив цикл, который быстро выделяет большой объем памяти и посмотрев, что получится в сообщении об ошибке. Например:
источник
Прежде всего, сначала нам нужно понять, как PHP.ini работает в процессе интерпретации. memory_limit - это директивы для PHP.
при использовании с функцией PHP вы должны сделать что-то вроде этого
ini_set(‘memory_limit’,’256MB’)
. Таким образом, эта функция временно установит ваше значение для переменной интерпретатора. Если вы посмотрите ближе, то вы можете получить две колонки, одна для локального и один для глобального. Это показывает способность значений для человека соответственно.Но, когда вы определили для глобального, вы должны установить как суффикс с K, M, G соответственно. Если мы превысим это значение с помощью apache .htaccess, то потребуется то же самое для fpm PHP.
источник