2008-08-21 2 views
15

나는 Linux에서 VM웨어 내의 아파치를 실행 중이다. 내가 요청하고있어 PHP 페이지의sleep() 자동으로 돼지 CPU

하나는 sleep() 않습니다, 나는 찾을 것을 나는 첫 번째 페이지가 첫 번째 페이지에서 sleep() 기다리고 sleep()'ing, 두 번째 페이지에 달려 있습니다 동안 두 번째 페이지를 요청하려고하면 끝.

이 동작을 본 사람이 있습니까?

나는 PHP아니라고 알고 멀티 스레드을, 그러나 이것은 CPU의 총 부주의처럼 보인다.

편집 : CPU 사용량이 급증하지 않았 음을 언급해야합니다. CPU가 "hogging"한다는 것은 다른 PHP 페이지가 페이지를 sleep()하는 동안 CPU를 사용할 수 없다는 것입니다.

+0

당신은 이것을위한 해결책을 찾았습니까? 나는 똑같은 문제를 겪고있다. –

답변

1

실제로 CPU가 100 %로 이동하거나 다른 페이지가 제공되지 않는 것을보고 계십니까? 얼마나 많은 apache-instances가 runnning입니까? 당신이 실에서 잠을 자면 (들) 모두 멈추고 있습니까?

PHP의 sleep() 함수는 기본적으로 n 초 동안 유휴 루프를 실행합니다. 메모리를 해제하지는 않지만 CPU로드를 크게 증가시키지 않아야합니다.

4

이것은 Apache가 자식 프로세스를 1 개만 사용하고 있음을 의미합니다. 따라서

:

1 개 자식 프로세스가 요청을 처리하는 (수면이 경우에는 있지만 실제 작업을 수행 할 수 아파치의 차이를 말할 수 없다), 새로운 요청이 오면 그래서, 그것은 것 첫 번째 프로세스가 완료 될 때까지 기다려야합니다.

아파치가 스폰을 허용하는 하위 프로세스의 수를 늘리는 것이 해결책입니다 (prefork MPM을 사용하는 경우 MaxClients 지시어). PHP 스크립트에서 sleep()을 제거하기 만하면됩니다.

스크립트에서 무슨 일이 벌어지고 있는지 정확히 알지 못하면 말하기 어렵지만 아마 수면을 벗어날 수 있습니다().

+0

당신은 '아마'라는 단어로 약간의 개념을 길들 였지만, 결코 깨닫지 못했던 코드를 제거 할 수있을 것이라고 기대할 수는 없습니까? – JoeBloggs

+3

미안하지만 내 말을 더 분명하게 말하지 않았습니다. 나는 잠을 자지 못하고 응용 프로그램이 계속 작동한다는 것을 의미하지는 않습니다. 나는 모든면에서 sleep()이 좋은 이유가 없기 때문에 sleep()없이 작동하도록 응용 프로그램을 다시 작성할 수 있음을 의미합니다. – rix0rrr

10

호출 된 페이지가 세션을 열고 커밋하지 않을 수 있습니다.이 경우 해결 방법은 this answer입니다.

+4

session.auto_start가 1로 설정된 상태에서 php.ini를 구성한 경우 코드가 실행되기 전에 세션이 열리고 명시 적으로 닫거나 페이지가 끝날 때까지 열려있게됩니다. 두 번째 요청은 코드 줄을 실행하기 전에 중단됩니다. –

+2

필자의 경우, 루프를 시작하기 전에'session_write_close()'를 호출하면'sleep'이 서버의 다른 페이지에 대한 액세스를 잠글 수 없게됩니다. – thirdender

관련 문제