PHP는 php.ini 파일에서 구문 분석을 수행합니까?


24

RHEL 7.7에서 PHP 버전 7.1.30 실행

memory_limit를 충돌시키고 싶지만 구문이 올바른지 확실하지 않습니다 (예 : 256M 또는 256MB). 우선 memory_limit 설정으로 잘못된 값 "Hugo"를 입력했습니다. 이 문제는 phpinfo () (httpd에서 실행)의 결과 문자 그대로 "Hugo"라는 문자열이 있습니다.

여기에 이미지 설명을 입력하십시오

따라서 이것은 PHP가 실제로 값을 확인하는 것이 아니라는 것을 걱정했습니다. (제공된 값이 좋지 않은 경우 기본값으로 되돌릴 것으로 예상됩니다.)

누구든지 이것에 대해 언급 할 수 있습니까? 특히 PHP가 어떤 일을 강제 할 것인지 (임의의 문자열을 제공 할 수 있는지) 어떻게 알 수 있습니까?


4
훌륭한 질문입니다.
팅크

3
이것에서 : php.net/manual/en/faq.using.php#faq.using.shorthandbytes 나는 그것이 같다고 가정합니다 (int) 'HUGO'; // => 0. 내 컴퓨터에서 2MB의 메모리가 사용되기 시작합니다.
요시


@ Yoshi 당신의 답변을 공개해야한다고 생각합니다. 좋은 설명입니다
Maksym Fedorov

@MaksymFedorov 나는 내 가정에 대한 실제 참조가 없기 때문에 망설입니다. 지금은 단지 관측 일뿐입니다.
요시

답변:


19

여기서 혼동되는 것은 설정이 특별한 구문을 가진 정수처럼 보이지만 내부적으로 문자열로 정의된다는 것입니다. 그런 다음 값이 변경 될 때마다 문자열이 별도의 전역 변수 로 구문 분석됩니다 . 결정적으로, 문자열을 정수로 구문 분석 한 결과는 설정 테이블에 다시 저장되지 않으므로를 호출 phpinfo()하면 구문 분석 된 값이 아닌 원래 입력이 표시됩니다.

소스에서 이것을 볼 수 있습니다.

지원되는 구문은에 정의되어 있습니다 zend_atol.

  1. 추가 텍스트를 무시하고 문자열을 숫자 값으로 구문 분석합니다.
  2. 문자열의 마지막 문자에서 외모, 그리고 곱 앞의 값이있는 경우 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

훌륭한 평가를 위해 @IMSoP에게 감사합니다. 어떤 종류의 버그 추적기에서도 이런 종류의 것을보고해야합니까? phpinfo ()가 반 직관적으로 생성하는 응답을 찾습니다. 그리고 예기치 않은 값이 발생할 때 PHP가 수행하는 작업에 대한 디버그 출력도 사라지지 않습니다.
주석

1
@tink 나는 bugs.php.net에서 기능 요청을 제기 하거나 , 대부분의 조정이 이루어지는 내부 메일 링리스트에 메시지를 보낼 수 있다고 생각한다 . 몇 년 전에 비슷한 요청을 찾았 지만 응답이없는 것 같습니다.
IMSoP

다시 한번 감사드립니다. :)
팅크

0

우선, 먼저 워크 플로 해석 방식으로 PHP.ini의 작동 방식을 이해해야합니다. memory_limit는 PHP에 대한 지시어입니다.

PHP 함수와 함께 사용하면 다음과 같은 작업을 수행해야합니다 ini_set(‘memory_limit’,’256MB’). 따라서이 함수는 값을 일시적으로 해석기 변수로 설정합니다. 더 가까이 보면 하나는 로컬 용이고 다른 하나는 전역 용입니다. 그것은 개인에 대한 가치의 능력을 각각 보여줍니다.

그러나 전역에 대해 정의 할 때는 각각 K, M, G의 접미사로 설정해야합니다. apache .htaccess를 사용하여이 값을 초과하면 PHP fpm에 대해 동일한 값이 필요합니다.


3
나는 OP가 메모리 제한을 설정하는 방법을 묻지 않는다는 것을 친절하게 지적하고 싶습니다 :)
Karolis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.