2011-04-12 3 views
0

나는 약간의 조언을 얻을 수 있기를 바라고있다.PHP CRON 작업과 사용자 로그인에서 함수 호출하기

필자는 PHP/MySQL 시스템에 회계 원장을두고 있으며, 원장에게 간격을두고 청구서를 보냅니다 (이 예에서는 한 달에 한 번). 또한 특정 날짜 이후에 적용해야하는 연체료가 있습니다. 인보이스의 '전기'일과 '늦은 날짜'는 DB에 이미 있습니다.

장부 항목을 자동으로 (한 달에 한 번) 적용하는 스크립트를 실행하는 가장 좋은 방법은 궁금합니다. 자동으로 연체료를 입력합니다 (필요한 경우 한 달에 한 번). 모든 시스템 사용자에게이 날짜는 다르며 내가 말한 것처럼 DB에 모두 저장됩니다. 내가보기로 내 옵션은 다음과 같습니다

  • 는 하루에 한 번 (즉 오전 12시 매일) 실행 CRON 작업 - 그리고 날짜 조건이 충족되는 경우 작업을하고, 모든 항목을 통과합니다.

    나는 매일 같은 시간에 모든 것을 한꺼번에 처리하기 때문에이 방법이 마음에 듭니다.

    다음과 같은 이유로이 방법이 걱정됩니다. (1) CRON 작업이 예약되었을 때 서버가 다운 된 경우 CPANEL이 그 날을 완전히 건너 뛸 수 있습니까? 그리고 (2) 100k 또는 100Million 항목을 살펴 본다면 이것이 실행될 때마다 내 서버에서 참을 수없는 부하가됩니까? 그것을 얻을 수 있기 때문에 날짜 조건이 충족 될 경우

  • 콜이 스크립트에서, 때 관련 사용자가 로그인을 "작동합니까"할 수 있습니다.

    나는만큼이 방법을 좋아하지 않는 이유입니다 신청할 청구서 수와 적용 할 연체료가 얼마나 많은지 복잡한 점이 많습니다. 또한, 나는 모든 사람의 모든 것을 볼 수있는 "관리자"사용자가 - 그 사용자는

    ...하지 세입자가 최근 충분히 로그인하지 않은 경우 정보 원장 최신 내가 좋아하는 않는 reasn을 이있을 수 있습니다 이 방법은 분명히 서버에 부하가 적기 때문입니다 ...

아마도 나는 생각하는 것 이상입니다. 확실하지 ...하지만 조언을 많이 주시면 감사하겠습니다. 감사합니다. .

+0

사용자가 1 년 동안 시스템에 로그인하지 않으면 어떻게됩니까? 인보이스를 보내지 않겠습니까? – zerkms

+0

매일 수행하는 경우 업데이트가 필요한 대량의 행이 실제로있을 것으로 예상합니까? 두 번째 경우에는 2 가지 일을하는 것이 좋습니다. 1. 관리자가 특정 사용자를 볼 때 결과 계산. 2. 페이지에 통계가있는 경우 관리자에게 데이터를 동기화하는 버튼을 제공하십시오. 이제는 사용자가 결코 돌아 오지 않을 수도 있고 관리자가 게으 르기 때문일 수도 있습니다. 두 가지 방법의 조합을 시도 할 수 있습니다. 추신 내가 아는 한은 cronjob이 실패합니다. 그것은 "건너 뛴다". – Khez

+0

** @ zerkms ** - 귀하의 요지를 보는 동안 사실은 여전히 ​​코드가 궁극적으로 강건하기를 원합니다 ... 그리고 돈을 모으는 것에 대해 진지해질 때까지 2 ~ 3 개월은 일반적입니다 ... * * @ Khez ** - 100Mil 행을 업데이트하지는 않지만 100Mil 행을 확인해야합니다 ... – Shackrock

답변

1

나는 모든 이점에 대해 cron 탭을 사용하는 것이 가장 좋습니다. 나는 그것이 INNODB와 같은 트랜잭션 세이프 테이블을 사용하고 cron 탭의 완료를 로그하는 경우 crontab 중 테이블이 충돌하면 변경 사항이 되돌려지고 로그를 검사하여 어떤 날짜를 볼 수 있는지 추가합니다. 수동으로 변경 작업을 수행 할 수 있도록 충돌이 발생했습니다. 사실 crontab 작업의 완료를 테이블에 기록하면 누락 일을 자동으로 처리하기 위해 해당 로그를 사용할 수 있습니다 (스크립트가 마지막으로 몇 일 전에 실행되었는지 파악).

서버가로드되는 한 많은 레코드를 즉시 업데이트하는 데 문제가 없을 것입니다. 문제는 제대로 구조화 된 쿼리를 사용하면 선택한 매개 변수와 일치하는 날짜가있는 레코드를 기반으로 업데이트 (또는 삽입)해야한다는 것입니다. db의 모든 레코드를 실제로 루프 할 필요는 없습니다.

+0

"transaction safe"테이블은 무엇을 의미합니까? 나는'INNODB'를 사용하지 않았습니다. 왜냐하면'myisam'이 "읽은 톤"에 대해 더 잘 이해하고 있기 때문입니다. (필자의 솔루션은 쓰기보다는 읽기가 더 많습니다.) ** ** 더 이상 날짜를 확인하기 위해 모든 레코드를 반복해야합니다. 나는 그 일에서 벗어날 수 없다. 물론 나는 조건이 충족되는 곳에서만 업데이트 할 필요가 있습니다. – Shackrock

1

크론 작업은 좋은 아이디어라고 생각합니다. 그러나 두 방법 중 하나는 항목 (행)을 "처리 중"으로 표시하는 방법을 원할 수 있습니다. cron 작업은 날짜가 아닌 "처리되지 않은"데이터를 찾습니다. IMHO가 더 안전하며 어떤 이유로 든 작업 실행에 실패하면 문제가 해결됩니다.

나는 내 애플 리케이션 중 하나에서 비슷한 기능을 가지고. 그러나 큐 스타일에 가깝습니다. 작업은 응용 프로그램의 모든 부분에서 대기열에 놓입니다. 작업자 (cron을 통해 트리거 될 수 있음)는 대기열을지나 작업을 완료하고이를 "처리 중"으로 표시 한 다음 처리합니다. 다음 작업자가 와서 "처리 중"이라는 작업을 발견하면 작업자가 좀비가 아닌지 확인합니다. 존재하면 작업을 종료하고 작업을 다시 시작합니다. 기타 등등

사실 저는 다양한 유형의 작업 (전자 메일 알림, 파일 업데이트 등)을 보유 할 수있는 하나의 마스터 대기열을 가지고 있으며 작업자는 마스터 대기열을 작업 특정 대기열 (전자 메일 등)로 처리합니다.