2012-11-20 3 views
7

최근 방문자 기록에 PHP 실행 시간을 추가하여 코드 또는 데이터베이스의 가능한 문제점을 찾아 냈습니다. 시간은 스크립트의 시작과 끝의 마이크로 시간()으로 측정됩니다.대기 시간이 긴 (?) 사용자를위한 긴 PHP 실행

평균 실행 시간 (사이트의 디버그 버전에 대한 자체 테스트 포함)은 2-15ms입니다. 그런 다음 일부 사용자의 경우 + 300ms 실행이 무작위로 표시됩니다. 로드 스파이크, 캐시되지 않은 데이터베이스 쿼리 또는 파일 시스템 액세스로 인해 발생할 수 있습니다.

내가 이해할 수없는 것은 매 5 ~ 30 초 (!)의 실행 시간을 가진 모든 사용자를 나타냅니다. 내 테스트를 기반으로 그 임의의 페이지에 겉보기에 나타납니다 그리고 그 시간에 대한 액세스 로그에 대한 요청 스파이크가 없으며,이 느린 성능을 일으킬 수있는 코드 나 데이터베이스 쿼리에는 아무 것도 없습니다. 그 요청 중 90 %는 중국에서 왔으며 어떤 종류의 크롤러 나 봇처럼 보입니다.

So : 대기 시간은 PHP 스크립트의 실행 시간에 영향을 미칠 수 있습니까? 이전 버퍼가 사용자에게 전송되는 동안 PHP 실행이 중단 되었습니까?

나는 겉보기에 비슷한 문제로이 다른 스레드를 찾았지만 아무 대답이 없었다 : PHP's execution time changes based upon internet/connection latency?

편집 :
내가 4K 128K 바이트에서 PHP의 output_buffering을 증가 끝났다. 이제는 일반적인 실행 시간이 2 ~ 6ms로 떨어졌으며 무작위로 엄청나게 긴 시간이 필요하지 않습니다.

+3

"대기 시간은 PHP 스크립트의 실행 시간에 영향을 미칠 수 있습니까? 이전 버퍼가 사용자에게 전송되는 동안 PHP 실행이 중단 될 수 있습니까?" --- 리버스 프록시로서 nginx가 사용되는 것을 막기 위해서. 그래서 PHP + 아파치가 빨리 작동하고 nginx가 서서히 작동합니다. – zerkms

+0

아파치 자체를 PHP 용 버퍼로 작동시키는 방법이 없습니까? 아파치 프로세스가 더 오래 살면 정말 신경 쓰지 않아요, 유일한 문제는 PHP 스크립트가 페이지 실행 시간 통계를 엉망으로 만든다는 것입니다 ... – MiikaH

답변

1

지연 시간은 서버 구성, 특히 output_buffering and implicit_flush에 따라 PHP 실행 시간에 영향을 미칠 수 있다고 생각합니다.

또한 PHP 스크립트의 속도를 늦출 수있는 gethostsbyaddr과 같은 기능이 있습니다.

아마도 XDebug를 사용하여 실행 추적을 생성하고 스크립트 실행의 "타임 라인"을 볼 수 있습니다.

+0

그래, 나는 "output_buffering"값이 이것과 관련이 있다고 생각했다. PHP가 버퍼를 플러시 할 때마다 지연이 발생한다고 생각합니다. 불행히도 output_buffering을 늘리면 전체 페이지가 생성되기 전에 브라우저로 보내지는 것이 없으므로 일반 퍼포먼스가 악화됩니다. – MiikaH