2012-08-15 4 views
1

"현재 시스템 자원 과용"에 대해 호스팅 제공 업체가 두 번 중단 한 웹 사이트가 있습니다. 각각의 경우에 PHP 스크립트 중 하나의 300-400 충돌 복사본이 서버에서 계속 실행되었습니다.PHP 스크립트 충돌 및 최대 실행 시간

스크립트 자체는 가정의 웹 카메라에서 이미지를 가져 와서 서버로 복사합니다. 파일 잠금을 사용하여 한 번에 하나만 쓸 수 있습니다. 스크립트는 페이지를 보는 모든 클라이언트가 3 초마다 호출합니다.

처음에는 PHP 스크립트가 완료 (결과 반환) 또는 충돌 (내부 서버 오류 페이지 반환 중)이라는 것을 알고 혼란스러워했습니다. 그러나 나는 "존재하지 않는 스크립트"가 매우 흔한 일이라고 알려줍니다.

누구나 나를 교육시킬 수 있습니까? 나는 이것을 끔찍하게 봤지만 죽은 상태에서 스크립트가 어떻게 끝날지를 볼 수는 없다. 최대 실행 시간에 도달하면 시간이 초과되지 않습니까?

내 호스팅 제공 업체가 Linux 플랫폼에서 CGI로 설정된 PHP를 사용하고 있습니다. 나는 실제로 그 무리가 블로킹 기능 (그리고 나는 LOCK_NB 마스크를 사용하지 않고 있음)을 인식하지 못했기 때문에 스크립트의 문제점을 확인했다. 어떻게 든 스크립트의 복사본 수백 개가 리소스가 사용 가능할 때까지 기다리는 것을 막았으며 충돌로 이어질 것이라고 가정합니다. 이 소리가 그럴 듯한가? 다시 일시 중지 될 염려가 있으므로 사이트를 다시 활성화하는 것을 꺼립니다.

모든 의견을 크게 높이 평가합니다.

+0

왜 파일 잠금이 필요한지, 또는 요점은 무엇보다 하나의 실행 스크립트가 같은 파일에 기록해야하는지 알 수 없습니다. 이전에 아약스 호출에 대한 성공 처리기에서'setTimeout()'을 호출하는 대신에 setInterval()에서 ajax 호출을해야하는 것처럼 들린다. 파일을 flock() 할 경우, 파일을 끝내자 마자'LOCK_UN '을 기억하고, 읽고 있다면'LOCK_EX','LOCK_SH '충분할 것이다. – DaveRandom

+0

이것은 공급자와 실제로 같은 문제로 들립니다. 아마 아파치/suPHP를 사용하고 있습니까? –

+0

@Jack 처음에는 생각했지만, mod_php (방금 테스트 한 것)로 볼 수있었습니다. 왜냐하면'flock()'이 차단되고 * nix에서 스크립트를 실행하면 스크립트가 결코 절대로 죽지 않을 것이기 때문입니다 잠금 대기열의 맨 위로 이동합니다. 이것이 사실 인 것은 꽤 어리석은 일이지만 분명히 그렇습니다. ['set_time_limit()'매뉴얼 페이지 (http://php.net/manual/en/function.set-time-limit.php)에 그 취지에 대한 메모가 있습니다. – DaveRandom

답변

0

스크립트는이 두 가지 제한에 충돌 할 수

  • max_execution_time이라는
  • memory_limit를

당신이 스크립트에서 다른 오류가없는 경우를 제외하고/너무 통지 오류

1
확인, 자원과 작업하는 동안

아마도 내가 권장할만한 접근법은 tempnam()을 먼저 사용하고 그 안에 내용을 쓰는 것입니다 (다소 시간이 걸릴 수 있습니다). 완료되면 파일 잠금 등을 수행합니다.

PUT 요청이 수행되고 있는지 여부는 확실하지 않습니다. 일반적으로 PHP는 파일 업로드를 먼저 처리하여 스크립트에 전달합니다.

+0

Thanks Jack. 위의 Dave의 제안과 함께 스크립트를 다시 작성하여 시도해보십시오. 죄송합니다. 새로운 사용자이므로 투표를 할 수 없지만 어떤 경우에는 감사하겠습니다. – Lewis