2012-01-13 3 views
0

다른 서버에 로그인하고 내 데이터베이스에서 내 테이블을 업데이트하는 정보를 가져 오는 cron 스크립트가 있으며 완료되면 연결이 닫히고 전자 메일이 전송됩니다.시스템 제한으로 인해 cron 스크립트에서 일시 중지

내가 지금 얻고있는 문제는 그들이 60 초당 20 개의 행만 업데이트 할 수 있다고 말하는 제한을 적용했다는 것입니다.

나는 sleep() 함수를 살펴 보았고 누군가 제안서를 작성하는 등의 일을한다. 이것을 처리하고 좋은 해결책을 얻는 가장 좋은 방법은 무엇입니까? 해당 테이블의 모든 행이 업데이트 될 때까지 스크립트를 계속 진행해야합니다.

+0

분당 20 개가 넘는 행이 추가되면 다운로드가 데이터를 따라 잡을 수 없다는 점에 유의하십시오. 그들이 제한을 부과하는 경우, 당신이 할 수있는 한 빨리 작업을 시도하면 그들의 한계를 초과하는 당신을 멈출거야. 그들이 당신에게 자신에게 한계를 부과 할 것을 요구한다면, 당신은 각 줄 다음에'sleep (3)'과 같은 것을 사용해야합니다. –

+0

흠, 지금은 여러 가지 방법을 시도했지만, 20 줄 이후에 "finsish"한 것처럼 보입니다. 문제가 그것이 내가 추가 한 수면 기능인지 또는 그 때까지 시스템에서 로그 아웃했는지는 알 수 없습니다. sleep()이 실행 중입니다. 제안? –

답변

0

실제로 수면이 일반적으로 어떻게되는지. PHP에서 sleep은 초 동안 만 잠자기가 가능하므로 두 번째 방법을 사용하는 경우 usleep 또는 time_nanosleep을 사용하십시오.

모든 쿼리가 즉시 실행되고 일괄 처리를 실행한다는 가정을하고 싶다면 60 초당 20 행으로 제한하는 것이 매우 쉽습니다. 각 행에서 3 초 후에 절전 모드로 전환하십시오. 쿼리가 즉각적이지 않으면 초당 적은 수의 행을 삽입해야합니다.

원하는 경우 삽입 시간을 3 초 동안 유지하면 각 행이 개별적으로 삽입되는 데 3 초 미만인 경우 60 초당 20 행이 보장됩니다. 길이가 길어지면 60 초당 20 점 미만으로 떨어집니다. 나는 이것이 정말로 가치가 없다고 제안합니다. 데이터베이스가 이미 과부하되었을 때 인서 터가 더 열심히 작동하게 만드는 나쁜 결과를 가져올 것입니다.

자동 커밋 모드가 아닌 경우 자주 커밋하기를 원할 것입니다. 커밋되지 않은 변경 사항을 필요 이상으로 오래 보관하는 것은 일반적으로 바람직하지 않습니다.

마지막으로, 더 긴 시간 동안 평균 20 행/60 초를 유지해야하는 경우 (들어오는 데이터가 터지면) 토큰 버킷 필터로 이동합니다. 매 3 초 (60 초/20 초) "버킷"에 "토큰"을 추가합니다. 양동이는 최대 20 개의 토큰을 수용합니다. 행을 삽입 할 때마다 버킷에서 토큰을 제거합니다. 버킷이 비어있는 경우 토큰을 삭제할 때까지 기다립니다.

관련 문제