문제

preg_match('/(.)*/', str_repeat('x', 20000), $matches);

PHP에서 위의 명령을 실행하게 되면 $matches 변수가 아래와 같이 세팅되어야 한다.

array(2) {
	[0]=>
	string(20000) "xx...xx"
	[1]=>
	string(1) "x"
}

하지만 거의 모든 버전의 PHP에서 이 문장을 실행할 때 Segmentation fault가 발생한다. .(dot) 문자가 일정한 횟수 이상 매칭될 때 발생하는걸로 생각되는데 ereg 계열 함수는 이런 문제가 발생하지 않는다.

해결책

입력되는 문자열의 크기와 구성을 예상할 수 없는 상태에서 preg 계열 함수를 사용할 때 *, + 기능을 사용하려면 매칭되는 횟수에 제한을 둘 필요도 있다.

preg_match('/(.){0,1000}/', str_repeat('x', 20000), $matches);

위와 같이 최대 1,000개의 문자만 매칭하도록 제한하면 정상적으로 처리가 되거나 아래처럼 에러를 발생하므로 비정상적으로 프로세스가 죽는 문제는 피할 수 있다.

Warning: preg_match(): Compilation failed: regular expression is too large at offset 12 in test.php on line 1