여기서 혼동되는 것은 설정이 특별한 구문을 가진 정수처럼 보이지만 내부적으로 문자열로 정의된다는 것입니다. 그런 다음 값이 변경 될 때마다 문자열이 별도의 전역 변수 로 구문 분석됩니다 . 결정적으로, 문자열을 정수로 구문 분석 한 결과는 설정 테이블에 다시 저장되지 않으므로를 호출 phpinfo()
하면 구문 분석 된 값이 아닌 원래 입력이 표시됩니다.
소스에서 이것을 볼 수 있습니다.
지원되는 구문은에 정의되어 있습니다 zend_atol
.
- 추가 텍스트를 무시하고 문자열을 숫자 값으로 구문 분석합니다.
- 문자열의 마지막 문자에서 외모, 그리고 곱 앞의 값이있는 경우
g
, G
, m
, M
, k
, 또는K
시작시 숫자가없는 값은 0으로 구문 분석됩니다. 전역 변수를 설정하면 상수에 따라 메모리 제한이 최소값으로 설정됩니다 ZEND_MM_CHUNK_SIZE
.
메모리 제한을 설정 한 다음 많은 양의 메모리를 신속하게 할당하는 루프를 실행하고 오류 메시지에서 무엇이 나오는지 확인하면 효과를 볼 수 있습니다. 예를 들어 :
# 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