PHP выполняет ли анализ файла php .ini? - PullRequest
24 голосов
/ 22 января 2020

Запуск PHP Версия 7.1.30 под RHEL 7.7.

Я хочу поднять memory_limit, но не был уверен, что у меня был правильный синтаксис (то есть 256M или 256MB). Поэтому для начала я поставил неверное значение "Hu go" в качестве настройки memory_limit. Проблема в том, что phpinfo () (работает под httpd) буквально содержит строку «Hu go», то есть:

enter image description here

Так что меня это несколько беспокоит, что PHP на самом деле не проверяет правильность значений. (Если предоставленное значение было плохим, я бы ожидал, что оно вернется к значению по умолчанию, например)

Может ли кто-нибудь прокомментировать это, в частности, как вы узнаете, будет ли PHP обеспечивать соблюдение (если произойдет произвольное строка может быть предоставлена).

Ответы [ 2 ]

19 голосов
/ 27 января 2020

Смущает то, что настройка выглядит как целое число с некоторым специальным синтаксисом, но внутренне определяется как строка. Затем строка анализируется в отдельной глобальной переменной при каждом изменении значения. Важно отметить, что результат разбора строки на целое число не сохраняется обратно в таблицу настроек, поэтому при вызове phpinfo() вы видите исходный ввод, а не проанализированное значение.

Это видно в источнике:

Поддерживаемый синтаксис в конечном итоге определен в zend_atol, который:

  1. анализирует строку для значения цифры 1010 *, игнорируя любой дополнительный текст
  2. просматривает последний символ строка, и умножает предыдущее значение, если оно равно g, G, m, M, k или K

Значение без цифр в начале будет проанализировано как ноль , При установке глобальной переменной это установит предел памяти на минимально допустимый, основанный на константе ZEND_MM_CHUNK_SIZE.

. Вы можете увидеть эффект, установив предел памяти, а затем быстро выполнив al oop выделяет большой объем памяти и смотрит, что выходит в сообщении об ошибке. Например:

# Invalid string; sets to compiled minimum
php -r 'ini_set("memory_limit", "HUGO"); while(true) $a[]=$a;'
# -> PHP Fatal error:  Allowed memory size of 2097152 bytes exhausted

# Number followed by a string; takes the number
php -r 'ini_set("memory_limit", "4000000 HUGO"); while(true) $a[]=$a;'
# -> PHP Fatal error:  Allowed memory size of 4000000 bytes exhausted

# Number followed by a string, but ending in one of the recognised suffixes
# This finds both the number and the suffix, so is equivalent to "4M", i.e. 4MiB
php -r 'ini_set("memory_limit", "4 HUGO M"); while(true) $a[]=$a;'
# -> PHP Fatal error:  Allowed memory size of 4194304 bytes exhausted
0 голосов
/ 27 января 2020

Первым делом, во-первых, нам нужно сначала понять, как PHP .ini работает в процессе интерпретации. memory_limit - это директивы для PHP.

, при использовании с функцией PHP вы должны сделать что-то подобное ini_set(‘memory_limit’,’256MB’). Таким образом, эта функция временно установит ваше значение для переменной интерпретатора. Если вы посмотрите ближе, то вы можете получить две колонки, одна для локального и один для глобального. Это показывает способность значений для индивидуума соответственно.

Но, когда вы определили для глобального, вы должны установить в качестве суффикса соответственно K, M, G. Если мы превысим это значение, используя apache .htaccess, то потребуется то же самое для PHP fpm.

...