2014-12-06 1 views
0

나는 웹 프로그래밍에 익숙하지 않으므로 나와 함께하시기 바랍니다.완성 된 PHP 처리를 기다리는 최선의 방법

폼 데이터를 PHP exec() 함수에 제출하는 웹 페이지를 만들었습니다. 이 함수는 웹 사이트에서 데이터를 한 번 또는 여러 번 요청하고 다양한 방법으로 데이터를 조작 한 다음 웹 서버의 파일에 저장합니다. 처리하는 동안 로더 .gif 파일이 웹 페이지에 나타납니다. 프로세스 대기 기간을 처리 할 JavaScript 코드를 만들었지 만 올바르게 처리하고 있는지 확신 할 수 없습니다. 다음과 같이 스크립트입니다 :

<script> 

window.set = 0; 
window.uid = ''; 

document.forms[0].onsubmit = function(e) 
{ 
    console.log($(this).serialize()); 
    e.preventDefault(); 
    e.stopPropagation(); 

    // Display "Waiting" .gif during processing 
    $('#loader').show(); 

    // Perform data submission once (when window.set = 0). After that, 
    // keep waiting for output and manifest file to be created. Call 
    // "fetch" function repeatedly to test for completion. When completed, 
    // call clearInterval to stop processing. 

    window.int_ = setInterval(function() 
    { 
     $.ajax({ 
      "url": "./", 
      "type": "POST", 
      "data": !window.set ?$("#form").serialize() : { 'fetch': 1, 'uid': window.uid }}).done(function(data) 
      { 
       var d = data = JSON.parse(data); 

       if (!window.set) 
       { 
        window.uid = d.uid; 
        window.set = 1; 
        return; 
       } 

       if (data.status === 'ok') 
       { 
        document.location.replace(data.href); 
        data.manifest = data.manifest.replace(/\./g, ".<br />"); 
        $('#manifest').show(); 
        $('#manifest').html("<b>Results from run:</b> <br />" + data.manifest); 
        $('#loader').hide(); 
        window.set = 0; 
        window.uid = ''; 

        clearInterval(window.int_); 
       } 
       else 
       { 
        // waiting 
       } 
      }); 
    }, 100); 
} 
</script> 

다음과 같이 첫 번째 AJAX 호출에 언급 된 "가져 오기"기능에 대한 코드는 다음과 같습니다

if ($_POST['fetch']) 
{ 
    $uid = $_POST['uid']; 

    /* check for availability*/ 

    if (is_file(realpath("./$uid"))) 
    { 
     $f = file_get_contents($uid); 
     $m = file_get_contents("./$uid.manifest"); 
    } 
    else 
    { 
     $f = ""; 
    } 

    if ($f != "") 
    { 
     echo json_encode(array("status" => "ok", "href" => $f, "manifest" => $m)); 
     die(); 
    } 
    else 
    { 

     echo json_encode(array("status" => "err", "href" => $f)); 
     die(); 
    } 
} 

은 내가 여기하려고 노력하고있어 수행하는 외부 처리가 완료 될 때까지 기다리는 동안 한 번 웹 사이트 처리/조작. "fetch"함수는 출력 파일이 생성되었는지 확인합니다. 있으면 처리가 끝납니다.

프로그래밍 방식으로이 문제를 해결할 수 있습니까? 훨씬 더 나은 대안이 있습니까?

귀하가 제공 할 수있는 통찰력에 대해 크게 감사드립니다. 나는 정말로 일을하는 올바른 방법을 배우고 싶다.

+0

10FPS가 너무 많아서 3 또는 4 단계로 내려갑니다. 아니면 그냥 polling하지 않고도 완료 될 때까지 PHP에서 sleep() + loop를 반복하십시오. – dandavis

답변

0

나는 PHP로 작성된 귀하의 경우 처음에는

당신은 웹 서버에 백엔드 코드를 가지고 ... 쉽게는 HTTP 요청의 설명하게하려고합니다. 이 스크립트는 다른 일을하지 않고 보낸 데이터를 처리하고 실패를 게시 (반향)하거나 프런트 엔드 클라이언트로 다시 처리합니다. 당신의 경우에는 전부입니다.

프론트 엔드 쪽 언어 또는 장치에 관계없이 거의 동일한 절차입니다.

비동기식 작업에서 HTTP POST 또는 GET 요청을 호출합니다. jQuery는 PHP에 $ .ajax 함수를 호출하여이를 수행합니다.

또한이 요청에서 비동기 처리가 끝난 후 자동으로 호출되는 콜백 함수를 정의합니다. jQuery는 $ .ajax 바로 다음에 .done() 함수가있다.

로딩을 나타내는 데 가장 좋은 방법은 $ .ajax 코드 줄 바로 앞에서 로딩 이미지를 표시하는 것입니다. .done() 함수 내에서 숨기거나 제거하십시오.로드가 완료되었음을 나타 내기 위해 ...

모두입니다.

관련 문제