2013-03-23 10 views
2

현재 프로젝트 용으로 Achievements 시스템을 계획 중입니다. 사용자가 실제로 성취도 페이지를 방문하면 성취도가 잠금 해제되고 완료되지 않은 성취도는 진행률이 표시됩니다.AJAX/PHP 비동기식 계산

업적 중 일부를 계산하는 데 다소 시간이 걸릴 수 있습니다. 나는이 아이디어를 내놓았다,하지만 난 어떻게 구현 가야하는 아무 생각이 없다, 또는 심지어 가능하다면 :

  • 자바 스크립트가 AJAX를 통해 성과 데이터를 요청
  • PHP는 각각에 대해 성취 진행
  • 을 계산 시작 성과가 선이 ID:progress
  • 자바 스크립트는 각 행을 수신하고 주어진 성과

에 대한 진행 상황을 보여줍니다 형태의 출력 스트림에 기록됩니다 어떻게 것 AJAX가 도착하자마자 responseText을 한 줄에 모두 읽는 대신 한 줄씩 읽게하는 방법에 대해 생각해보십시오. 가능하면 또한, 내가 PHP를 위해 싶습니다


은과 같이 스레드 수 : "스레드"N보다가있는 경우에 대한

  • 기다립니다 각 성취

    • 하나는 현재의 성과를 계산하기 위해 스레드 떨어져
    • 포크를 완료하고 그 결과 라인을 반향하는

PHP에서 그런 일이 가능합니까?


아니면 완전히 잘못된 방향으로 가고 있습니까? 각 업적 그룹별로 AJAX 요청을 보내야합니까? 성취마다 하나씩? 대안으로 무엇을 제안 하시겠습니까?

+0

성능 병목 현상은 정확히 어디에서 발생합니까? 단일 성취도를 계산하는 것이 상대적으로 빠르다면 성취도 당 하나의 아약스 요청을 발행해도 괜찮습니다. 또한 크론 작업을 고려해 보셨습니까? (단점 : 사용자가 업적을 실시간으로 볼 수 없음) – bfavaretto

+0

@bfavaretto 대부분은 거의 순간적이지만, 좀 더 복잡한 데이터를 수집하고 처리해야하기 때문에 오래 걸릴 수도 있습니다. 나는 업적을 갱신하기 위해 cron을 사용하는 다른 게임을 해왔고, 나는 그것을 싫어했다. "나는 지금 나의 업적 *을 원한다."라고 나는 말할 것이다. –

+0

나는 당신이 생각했다. 일부 브라우저에서는 적어도 부분적으로 responseText를 읽을 수 있습니다. http://www.kylescholz.com/blog/2010/01/progressive_xmlhttprequest_1.html. – bfavaretto

답변

3

클라이언트의 XHR2 Progress Events과 서버의 HTTP Chunked Transfer Encoding의 조합을 사용하면 최신 ES5 브라우저에서이를 달성 할 수 있습니다. this Stack Overflow post이 더 자세히 설명됩니다.

개인적으로 나는이 접근법이 약간 과장되어 있다고 말할 수 있습니다. 처음으로 플레이어 업적을 가져 오는 데 2 ​​초도 채 걸리지 않으면 (주어진 시간 내에 후속 요청에 대해 캐싱을 수행한다고 가정하면) 플레이어를 다운로드하고 최적화하기 위해 기다리는 것입니다. 일단 그것을 보증 할 충분한 사용자가 있었다면 :