RHEL 7.7에서 PHP 버전 7.1.30 실행
memory_limit를 충돌시키고 싶지만 구문이 올바른지 확실하지 않습니다 (예 : 256M 또는 256MB). 우선 memory_limit 설정으로 잘못된 값 “Hugo”를 입력했습니다. 이 문제는 phpinfo () (httpd에서 실행)의 결과 문자 그대로 “Hugo”라는 문자열이 있습니다.
따라서 이것은 PHP가 실제로 값을 확인하는 것이 아니라는 것을 걱정했습니다. (제공된 값이 좋지 않은 경우 기본값으로 되돌릴 것으로 예상됩니다.)
누구든지 이것에 대해 언급 할 수 있습니까? 특히 PHP가 어떤 일을 강제 할 것인지 (임의의 문자열을 제공 할 수 있는지) 어떻게 알 수 있습니까?
답변
여기서 혼동되는 것은 설정이 특별한 구문을 가진 정수처럼 보이지만 내부적으로 문자열로 정의된다는 것입니다. 그런 다음 값이 변경 될 때마다 문자열이 별도의 전역 변수 로 구문 분석됩니다 . 결정적으로, 문자열을 정수로 구문 분석 한 결과는 설정 테이블에 다시 저장되지 않으므로를 호출 phpinfo()
하면 구문 분석 된 값이 아닌 원래 입력이 표시됩니다.
소스에서 이것을 볼 수 있습니다.
- 설정은 변경 될 때 콜백으로 정의됩니다.
- 콜백에는 원시 문자열 값이 제공됩니다.
- 특정 설정에 대한 콜백 은 특수 접미사를 처리하는 이라는 함수를
zend_atol
사용하여 문자열을 정수로 구문 분석합니다. - 그런 다음 전역 변수를 설정하는 함수 를 호출 합니다 ( “AG”는 “할당 관리자 전역 변수”를 의미합니다. 매크로가 컴파일 된 경우 스레드 안전성을 관리하는 데 사용됩니다)
지원되는 구문은에 정의되어 있습니다 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
답변
우선, 먼저 워크 플로 해석 방식으로 PHP.ini의 작동 방식을 이해해야합니다. memory_limit는 PHP에 대한 지시어입니다.
PHP 함수와 함께 사용하면 다음과 같은 작업을 수행해야합니다 ini_set(‘memory_limit’,’256MB’)
. 따라서이 함수는 값을 일시적으로 해석기 변수로 설정합니다. 더 가까이 보면 하나는 로컬 용이고 다른 하나는 전역 용입니다. 그것은 개인에 대한 가치의 능력을 각각 보여줍니다.
그러나 전역에 대해 정의 할 때는 각각 K, M, G의 접미사로 설정해야합니다. apache .htaccess를 사용하여이 값을 초과하면 PHP fpm에 대해 동일한 값이 필요합니다.