2013-09-23 6 views
-1

구문이 아니라 세그먼트로 나누어 진 간단한 설치 프로그램이 있습니다. 작동 원리는 다음과 같습니다.설치 진행률 표시 줄 PHP

if ($_POST['install'] == "Install") 
{ 
// fetches user values 

// creates tables 

// creates some files 

// creates some emails 

// inserts relevant stuff into the database 

// finishes 
} 

코드가 너무 길어서이 질문에 불필요합니다. 각 단계는 설치가 완료되면 20 %로 계산됩니다. 사용자에게 정보를 표시하는 진행 막대를 어떻게 만들 수 있습니까? 저는 두 가지 이유로 이것을 원합니다. 하나는 추적하기위한 것이고, 다른 하나는 완료되기 전에 브라우저 탭을 닫아서는 안된다는 것입니다.

이제 내 생각은 코드의 각 부분에 변수를 할당하는 것입니다. 예를 들어, $done = 20%은 첫 번째, $done = 40%은 두 번째 등이며 그 변수를 기반으로 한 진행률 막대 만 표시합니다. 내가 모르는 유일한 방법은 진행률 막대를 표시하는 방법입니다.

감사

+2

프로세스가 실제로 소요되는 시간은 얼마나됩니까? 모든 요청이 하나의 요청으로 완료 되었습니까, 아니면 "마법사"스타일 설치입니까? (한번에 모든 것을 설치하는 것처럼 보입니다.) –

+0

10 개의 테이블을 만들고, 일부 데이터를 삽입하고, cpanel에 후크를 넣어 이메일을 만들고, 몇 개의 파일 이름을 변경하고 1 개의 파일을 만듭니다. 나는 기계를 호스팅하는 부하에 따라 약 1 ~ 2 분간 최고라고 말하고 싶습니다. 모든 단계가 한 번에 끝나면 양식을 채우고 install =을 누르십시오. –

답변

2

내 권장 해결 방법 : 건조 할 경우

하기 때문에 같은 프로세스의 각 단계에 대해 별도의 아약스 요청을 만들기 ...

// do first step 
$.ajax({ 
    url: myUrl + '?step=1', 
    success: function() { 
    // update progress bar 20% 
    } 
}); 

// do second step 
$.ajax({ 
    url: myUrl + '?step=2', 
    success: function() { 
    // update progress bar 40% 
    } 
}); 

// etc. 

,이 시도 :

var steps = 5; 

for (var i = 1; i <= steps; i++) { 
    $.ajax({ 
     url: myUrl + '?step=' + i; 
     success: function() { 
     // update success incrementally 
     } 
    }); 
} 

jQuery UI 진행 표시 줄 :

$(function() { 

    $("#progressbar").progressbar({ 
     value: 0 
    }); 

    var steps = 5; 

    for (var i = 1; i <= steps; i++) { 
     $.ajax({ 
      url: myUrl + '?step=' + i; 
      success: function() { 
      // update success incrementally 
      $("#progressbar").progressbar('value', i * 20); 
      } 
     }); 
    } 

}); 

Ref. http://jqueryui.com/progressbar/#default

+1

이 방법의 또 다른 단점은 각 섹션이 독립형이라는 것입니다. 실패하면 모든 것을 잃어 버리지 않았습니다. 중단 된 부분부터 다시 시작할 수 있습니다. –

+0

쉬운 소리. 말 그대로 아약스 0을 알고 있다고 말하면 어떻게 코드를 기반으로 진행률 막대를 표시 할 것을 제안합니까? 고맙습니다! –

+0

코드를 사용하면 모든 ajax 함수가 동시에 시작될 수 있으므로 기본적으로 각 단계를 동시에 실행해야합니다. 각 단계는 단계적으로 수행해야하며 다른 단계가 완료되면 수행해야합니다. –

1

가장 좋은 방법은 진행 값을 APC, Memcache 또는 Redis와 같은 키 또는 값 저장 시스템에 저장하는 것입니다. 그런 다음 ajax 쿼리를 사용하여 진행률을 검색합니다.

좋은 jQuery 플러그인은 jQuery를-UI에서 progressbar 바, 당신은 진행 값을 인코딩하는 JSON을 사용할 수 있습니다

// GET /ajax/get-status.json 
{ 
    "progress":10, 
    "error":"", 
    "warning":"" 
} 

페이지 :

<div id="error" style="color: red"></div> 
<div id="warning" style="color: yellow"></div> 
<div id="message"></div> 
<div id="progressbar"></div> 
<script type="text/javascript"> 
     jQuery(document).ready(function() { 
      $("#progressbar").progressbar({ value: 0 }); 
      $.ajaxSetup({ cache: false }); 

      function updateProgress() { 
       jQuery.getJSON("/ajax/get-status.json", function(response) { 

        if (response.error) { 
         $("#error").html(response.error); 
         return; 
        } else { 
         $("#progressbar").progressbar('value', parseInt(response.progress)); // Add the new value to the progress bar 
         $("#message").html(response.message); 
         $("#warning").html(response.warning); 
         if(parseInt(response.progress) < 100){ 
          setTimeout(updateProgress, 1); 
         } 
        } 
        }); 
      } 

      updateProgress(); 
     });   
</script> 
+0

APC를 조사하고 있었지만 이해할 수있는대로 사용자가 수동으로 설치해야하므로 가능한 한 쉽게 만들려고합니다. 여기서 제공되는 모든 솔루션을 살펴보고 구현해 드리겠습니다.) –

+0

APC가 서버 끝에 설치됩니다. –

+0

db 또는 키 - 값 시스템을 사용하고 싶지 않다면 언제든지 세션에서 처리 할 수 ​​있습니다. . – skler

1

당신은 HTML5 진행을 사용할 수 있습니다 바.

아약스 요청을 보내 완료율을 반환하십시오. 진행 태그의 값을 변경하십시오.

<progress id='p' max="100" value="50"></progress> 
+0

이것은 답변이지만 끔찍하게 쓸모없는 답변입니다. –

+0

어떻게 그렇게? 그는 진행률 막대를 표시하는 방법을 모르고있었습니다. – Vlad

+0

이 답변은 다섯 번째 편집 후 더 나은 것 같아요. –