2010-08-03 3 views
1

이 질문은 내가 이전에 물어 본 질문과 관련이 있습니다. here을 참조하십시오.AJAX 응답을 세분화하기위한 추가 질문

클라이언트는 먼저 처리를 초기화 스크립트를 호출

는 분할 아약스 응답을 구현하는 방법으로, 나는이 작업을 수행 코드를 만들었습니다. 서버 측에서는 startScript.cgi 코드가 데이터를 생성하기 시작하며, 응답을 청크로 그룹화하고 순차적으로 색인 된 개별 파일 (chunk1.txt chunk2.txt 등)에 기록합니다. startScript.cgi가이 프로세스를 시작하자마자 클라이언트 측은? index = 0 매개 변수로 gatherOutput.cgi로 전송 된 두 번째 ajax 요청을 시작합니다.

gatherOutput.cgi이 요청을보고 '청크'를 찾습니다. $ index. '.txt'다음 데이터를 반환합니다. 클라이언트는이를 html로 출력 한 다음 매개 변수? index = 1 등으로 Output.cgi를 수집하는 두 번째 ajax 요청을 시작합니다.이 작업은 startScript.cgi의 모든 데이터가보고 될 때까지 계속됩니다. gatherOutput.cgi는 "청크 $의 index.txt가"를 찾을 수없는 경우

, 그것은이 루프로 전환 :

until(-e "$directory/chunk$index.txt") 
{ 
    #nothing 
} 
open $fh, "<$directory/chunk$index.txt" || warn "File not found. blah blah"; 
#Read file and print, etc... 

주, startScript.cgi을 완료하는 데 시간이 오래 걸릴 수 있습니다 코드, 그래서 포인트를 실행 새로운 출력을 생성 할 때 startScript.cgi의 이전 출력을 동시에 브로드 캐스트하는 것입니다.

이 문제는 성능이 저하되고 이전에 생성 되었음에도 출력이 오래 걸리는 것입니다. 나는 이것이 하드 드라이브 액세스가 startScript.cgi의 CPU 작업과 비교하여 매우 느린 것으로 추측하고 있으므로 gatherOutput.cgi는 새 청크가 작성되기를 기다리는 경우가 많으며 클라이언트가 자주 gatherOutput.cgi가 읽기를 기다리는 경우 파일 등. 다른 문제가있을 수 있지만.

이 문제를 해결하기위한 아이디어 나 제안 사항이 있습니까? 또는 누군가가이 문제에 대한 다른 접근법을 가지고 있다면 그것은 좋을 것입니다.

그런데 startScript.cgi는 한 번만 호출 할 수 있습니다. exec, system 또는 backticks와 같은 시스템 이스케이프와 함께 대용량 작업 시스템 작업을 시작하여 실행을 계속할 수 있으며 부분적으로 분할 할 수 없습니다.

답변

2

파일이 없을 때 gatherOutput.cgi가 루프에 빠져서는 안됩니다. 대신 파일이 아직 존재하지 않는다고 AJAX 요청에 상태를 리턴 한 다음 (setInterval 또는 setTimeout을 사용하여) 기다렸다가 몇 초 후에 다시 시도하십시오.

서버에서 훨씬 쉬울 것입니다. 사용자의 경우 여전히 로딩 그래픽이나 다른 프로세스가 백그라운드에서 계속 진행 중임을 알리는 메시지를 표시 할 수 있습니다.

+0

좋은 아이디어, 나는 이것을 구현하고 그것이 성능을 얼마나 향상시키는지를 보게 될 것이다. 감사합니다. 추가 제안 사항은 여전히 ​​감사하겠습니다. –

관련 문제