2011-10-22 1 views
3

아파치가 메모리가 부족하여 때때로 죽게됩니다. 이것은 일어날 필요가 없었습니다. 이 프로젝트에는 수백 개의 PHP 파일이 있습니다.PHP에서 재귀 적 런 어웨이 스크립트를 잡는 방법?

의도하지 않은 재귀가 생성되었다고 생각합니다. 즉, 자신을 호출하는 함수가 아니라 함수 A가 B를 호출하는 함수입니다.

나는 코드를 읽고 재귀를 찾는 것을 시도했지만 행운이 없었다.

PHP가 모든 재귀를 추적하도록 알려주거나 내부 스택이 일정 크기 이상일 때 경고를 표시하는 방법이 있습니까?

+0

xdebug를 사용하여 정보를 얻은 다음 완료하는 데 가장 오랜 시간이 걸리는 기능을 확인할 수 있습니다. 무한 재귀 함수가 있다면 그 목록의 맨 위에 올 것이므로 원하는 범죄자를 갖게됩니다. – Furicane

+0

나는 그것을 시도했지만, OS가 아파치 프로세스를 죽이면 xdebug는 아무 것도 기록하지 않는다. – Mikhail

+0

@Mikhail : 어떤 SAPI를 PHP에 사용하고 있습니까? CGI/FCGI/mod_php? – hakre

답변

3

아파치가 메모리가 부족하여 때때로 죽습니다.

글쎄, 적어도 시작점이 있습니다. PHP 스크립트로 인해 의심되는 질문을 읽을 수 있습니다.

어떤 것을 찾으려면 더 살펴야합니다. 내가 생각할 수있는 한 가지 방법은 PHP 오류 로깅을 활성화하는 것입니다. 그런 다음 많은 메모리 소비가 발생하는 곳에서 오류를 유발할 수 있도록 memory_limit을 낮은 값으로 설정하십시오. 오류 로그에서 오류가 발생한 행을 찾으십시오 (Protocol of some PHP Memory Stretching Fun 참조).

이것은 잠재적 인 장소를 제공합니다.

재귀가이 문제를 일으켜야하는지 확실하지 않습니다.

xdebug.max_nesting_level=<your preferred value> 

이 당신에게 오류 로그에서뿐만 아니라 더 유용한 정보를 제공해야합니다 재귀를 감지하려면 Xdebug는 및 제한 재귀 깊이를 사용할 수 있습니다.

메모리와 재귀 모두에 해당하지 않는 경우 PHP 또는 PHP Segault와 관련이 없으므로 웹 서버에서 해당 상황을 처리 할 수 ​​없습니다. 예를 들어 mod_php이 segfaults를 처리하는 방법에 대해서는 알지 못하지만 어쨌든 사용중인 SAPI를 지정하지 않았습니다.

그러나 일반적인 PHP segfaults 소스는 pcre 재귀 제한을 트리거하기 전에 PHP를 시작하는 정규 표현식입니다. 코드에서 정규식을 사용하는 경우 reduce the recursion limit을 낮은 값으로 설정하고 테스트하면 도움이되는지 테스트 할 수 있습니다. 그러나 귀하의 질문에서 그것이 원인인지는 분명하지 않습니다. 따라서 먼저 더 많은 것을 찾아야합니다.

+1

가능하면 +2가됩니다. – Mikhail