2013-06-19 2 views
0

DB에서 테이블을 채우기 위해 오랜 시간 동안 일해 왔습니다. 이 작업은 완료하는 데 여러 시간이 걸릴 수 있습니다. 그래서 진행률 표시 줄이 필요합니다. 페이지에 대해서만 계산하면 충분합니다. 지금까지 여러 솔루션을 찾았습니다 :스크립트간에 공유 변수를 구현하는 올바른 방법이나 서버 측 진행을 구현하는 방법은 무엇입니까?

  1. _SESSION. OK, 사용 된 대부분의 서버에서 작동하지만 크롬에서 ERR_RESPONSE_HEADERS_TOO_BIG 오류가 발생하고 세션 - 시작/세션 _ 기록 _ 클로즈가 루프에서 호출되어 일부 서버에서 "헤더가 이미 전송되었습니다"라는 오류가 발생합니다. 이 방법이 좋았지 만 이제 거부했습니다.
  2. long 연산의 루프 내부에서 ob_start/ob_end_flush 종류를 사용합니다. 이것은 작동하지 않습니다. 그것은 단지 버퍼 된 echo-ed를 스크립트가 끝난 후에 모두 표시합니다.
  3. db를 사용하여 공유 변수 저장 (아직 시도하지 않음)
  4. 별도의 (임시) 파일 사용. (아직 시도하지 않음).

저는 이미 긴 작업 (db 테이블 채우기)을위한 스크립트 하나와 JS가 진행 상태를 포함하는 공유 변수를 읽는 데 사용하는 스크립트를 구현했습니다. 이 두 스크립트는 .done 함수로 결과를 기대하는 jQuery .ajax 메소드를 호출했다.

다른 방법이 있습니까? 4) 변형을 사용하고 싶습니다만, 진행률 표시 줄을 구현하는 일반적인 방법은 무엇인지 알고 싶습니다.

감사합니다 :)

+1

이러한 긴 작업은 일부 유형의 백그라운드 작업 관리자를 사용하여 실행하는 것이 좋습니다. 브라우저 세션을 사용하여 실행하지 않는 것이 좋습니다. 브라우저가 실행하도록 요청할 수는 있지만 실제 실행은 대기열에 있어야하며 백그라운드에서 실행되어야합니다. – DevZer0

+0

이 솔루션을 사용해 보셨습니까 - http://spidgorny.blogspot.com/2012/02/progress-bar-for-lengthy-php-process.HTML? –

+0

@ DevZer0 - 백그라운드 작업 관리자가 보입니다. 간단한 예제가 있습니까? – netanalyzer

답변

0

첫째로 당신의 경우 아직 PHP 코드를 별도의 프로세스로 실행하고 있습니다.

<?php 

exec('/usr/bin/php /Path/to/script.php {$param1} {$param2} > /dev/null 2>/dev/null &'); 

?> 

그때, 당신은 다음 많은 DB가 완료 쓰는 방법 (상태를 얻기 위해 시간 제한 기능 내부 아약스 전화를 사용할 수있는 사용자의 ID에 대한 진행 상황과 함께 DB를 업데이트하려면이 과정을 얻을 것입니다, 어떻게 많은 왼쪽, 등) DB에서.

0

그럼 갈 방법하지만 사용자가 실수로 브라우저를 닫으면 세션을한다 사용하고 계십니까? 그러면 진행률 표시 줄이 초기 상태로 재설정됩니다. 또한 오류는 html이 표시되기 전에 헤더이 전송되기 때문에 발생합니다.

내 생각에 가서 가장 좋은 방법은 테이블 (데이터베이스)에 진행 상황을 저장하고 사용자가 페이지를 방문하여 테이블에서 꺼내어 얼마나 많은 작업이 완료되었는지를 표시하는 것입니다.

단계 :

1. Default State In Table: 0 - indicates that user has not filled out anything 
2. User Fills out page 1 update progress in table: 1 - indicates user completed page 1 
3. User Fills out page 2 update progress in table: 2 - indicates user completed page 2 

비율이가 다음을 수행 표시 :

$total = 3; //total pages that user needs to fill out 
$filledOut = $db->getUserProgressStatus(); //return the digit status of user progress 
$percent = ($filledOut/$total) * 100; //gives you % value 

그래서 이것은 당신이 각 페이지에 무엇을 얻을 값이다,

Page 1: (0/3) * 100 = 0% 
Page 2: (1/3) * 100 = 33% //first page completed 
Page 3: (2/3) * 100 = 67% //second page completed 
Page 4 (summary page): (3/3) * 100 = 100% //completed 
+0

이 답변에 만족합니다. 테스트는 필수입니다 :) – netanalyzer

0
function fcflush() 
{ 
    static $output_handler = null; 
    if ($output_handler === null) { 
     $output_handler = @ini_get('output_handler'); 
    } 
    if ($output_handler == 'ob_gzhandler') { 
     // forcing a flush with this is very bad 
     return; 
    } 
    flush(); 
    if (function_exists('ob_flush') AND function_exists('ob_get_length') AND ob_get_length() !== false) { 
     @ob_flush(); 
    } else if (function_exists('ob_end_flush') AND function_exists('ob_start') AND function_exists('ob_get_length') AND ob_get_length() !== FALSE) { 
     @ob_end_flush(); 
     @ob_start(); 
    } 
} 

//infinite loop example of usage 
$counter = 0; 
while (true) { 
    echo $counter."<br />"; 
    fcflush(); 
    $counter++; 
} 
+0

어떻게 루프를 중지합니까? – GGio

+0

웹 서버를 중지하거나 다시 시작하십시오 :) 실제로는 사용하지 마십시오. while ($ counter <100) {'또는 다른 조건부 – Dave