2011-04-07 2 views
0

MySQL 데이터베이스를 사용하는 PHP 웹 사이트가 있습니다.데이터베이스에 저장된 타이머 기반 상태 변경

우리는 사용자가 만든 타이머가있는 항목을 가지고 있으며 일단이 타이머가 카운트 다운되면 사용자 상호 작용없이 (기본적으로 다음에 누군가 보게 될 때) 상태가 변경되어야합니다.

정확한 방법으로 구현하는 방법을 모르겠습니다.

우리는 15시 15 분에 만료되는 객체 X가 있습니다. 그 다음에 객체 X를 보게 될 다음 사람은 만료 된 것으로 봅니다.

다음 번에 개체 X가로드 될 때 올바른 방법으로 만료되었는지 확인하고, 만료 된 경우 데이터베이스를 업데이트 하시겠습니까?

개체 X가 만료 된 후 동시에 10 명이로드되면 어떻게 데이터베이스를 업데이트하려고 시도하는 모든 10 개의 요청에서 어떤 종류의 경쟁 조건이 발생하지 않도록해야합니까?

매분마다 실행되는 cron 작업이 있습니까? 예를 들어, MySQL의 타이머를 사용하여 매분마다이를 확인하고 스크립트를 실행하는 방법을 사용할 수 있습니까?

나는 위에 열거 된 것과 같이 할 수있는 방법에 대한 몇 가지 아이디어가 있지만 가장 실용적인 것이 무엇인지, 또는 내가하는 긍정적 인 방법은 표준 방법이 무엇인지 잘 모르겠습니다. 이 문제를 해결하기 전에.

답변

2

다음 번에 개체 X가로드 될 때 올바른 방법을 사용하여 만료 되었으면 확인하고, 그렇다면 데이터베이스를 업데이트 하시겠습니까?

왜 데이터베이스를 업데이트해야합니까? DB 테이블에 중복성이있는 것처럼 보입니다. 예를 들어 is_expired 열, 그 다음 expires_at 열이있는 것처럼 들립니다.

그냥 is_expired 열을 없애지 않는 이유는 무엇입니까? 2 개의 정수를 비교하는 것이 싸기 때문에 무언가가 만료되었는지 확인하려면 expires_at 열을 가져 와서 현재 시간과 비교하십시오. 이렇게하면 DB에 변경 내용이 없기 때문에 만료되는 모든 경쟁 조건을 피할 수 있습니다.

+0

+1 OP 스펙에 기반하여, 이것은 갈 길입니다. –

+0

상태 기록 테이블이 있으며 상태가 변경 될 때마다 기록됩니다. 예를 들어, 우리는 투표 및 투표에 들어가는 지위가 1 주간 지속됩니다. 일주일이 지나면 성공 또는 실패로갑니다. –

+0

이것이 객체가 얻게 될 최종 상태이기는하지만, 만료로 인해 현재 상태가 실패 또는 합격 인 경우에 기초하여 마지막 상태 기록을 "가짜"로 만드는 것이 합리적입니다. 잘), 그 아이디어로 놀아야 만 할 것이다. –

1

물론 cron으로 처리 할 수 ​​있습니다. 또는 자바 스크립트 네이티브 함수 setInterval("checkFunction()", 10000);을 사용하여 db를 변경하십시오. 또는 DB의 날짜 필드를 사용하여 만료일을 확인할 수 있습니다.

날짜를 date_to_expire로 지정하고 만료일을 입력하면 쿼리 할 때마다 항목이 만료되었는지 확인합니다 (최대 초까지 올라갈 수 있음)