【비망록】PHP와 Ajax(jquery)로 진행 상황(프로그레스 바)를 표시한다

개요


  • 내부 도구에서 뷰에서 객체를 호출하여 데이터를 삽입하는 도구를 만들었습니다.
  • 처리에 시간이 걸리기 때문에 진행률 표시 줄을 표시하는 방향으로 설정했습니다.
  • 데이터를 보내는 것이 구조상? 지식 적으로 어려웠기 때문에 임시 파일로 내뿜고 ajax에서 일정 시간마다 읽는 방식으로 구현할 수있었습니다.

    결국 어떻게 되었습니까?


  • 테스트 검증의 gif로 실제로 데이터를 넣고 있는 장면이므로 진척의 추이가 느립니다.



  • 처리 구성 (간결하게)


  • index.php (뷰 및 뷰에서 처리가 작성됨)의 내용이 화면에 표시됩니다.
  • 사용자는 다양한 체크 박스와 라디오 버튼과 같은 조건을 넣습니다
  • 확인 버튼을 누르면 2.로 입력 된 조건을 바탕으로 데이터를 추출합니다 (추출한 것은 화면에 표시)
  • 추가 등록 버튼을 누르면 추출된 내용이 DB에 Insert되어 처리가 완료된다는 것입니다.

  • 데이터 삽입 조건


  • 약 8만건의 정보
  • DB의 부하를 생각해 5000건 단위로 Insert
  • 처리 시작부터 종료까지 약 15분

  • 삽입 중 화면 상태


  • 왼쪽 위의 빙글빙글이 계속 나오는 느낌

  • 삽입 후 화면 상태


  • 삽입 후 화면이 전환되고 예외가 없으면 완료 메시지가 표시됩니다.

    환경


  • PHP5.2.8
  • RHEL4
    , , , 사내 툴이라고 하는 일도 있어 리프레스의 예정도 없고 낡습니다.

  • ajax에서 값 교환 대신 로컬 파일에서 수시로 읽는 형태



    진행 상황은 업로드뿐입니까? 조사해도별로 나오지 않습니다.


  • 조사해도 나오는 것은 파일을 로컬로부터 서버에 업로드 할 때의 진행 상황의 표시 뿐이었습니다.
  • 대체로 뷰와 같은 파일에 쓰여진 처리의 값을 js 측에서 취득하고있는 내용이었습니다
  • 다른 php 파일에 요구를 던져 취득하는 것도 있었습니다만 이번은 오브젝트로서 호출한 파일로부터 3 파일처의 오브젝트를 호출 거기에서 Insert 하도록(듯이) 하고 있었으므로 실현하고 싶은 것과 다른 처리에 느꼈습니다

  • 구현 (실제보다 쉽게 ​​만든 것을 씁니다)



    진행 상황까지의 흐름



    1.Insert 시작
    2.Insert는 루프가 되어 있어 그 속에서 진행 상황을 덮어쓰기로 내보내도록 했습니다

    insert.php
    
    foreach ($idData as $id) {
        // 進捗率を求める(小数点以下はfloor()で切り捨て)
        $percent = floor($insertedIdCnt / $allIdCnt * 100);
    
        // ファイルに書込み
        $fp = fopen('percentNow.log', 'w');
        fwrite($fp, $percent);
        fclose($fp);
    
        // 挿入処理
    
        // 1ループ10秒止めておく
        sleep(10);
    }
    
  • 이 단계에서 매 루프에서 진행률 ($ %)을 덮어 씁니다.
  • 뷰 측에서 위에서 토해낸 파일을 읽어 갑니다 (이하에서는 js 파일로서 쓰고 있습니다만 실제로는 php 파일입니다

  • progress.js
    
    var Progress = (function() {
        function Progress(p) {
            this.bar = document.querySelectorAll('#progressBar > .progressBarBody')[0];
            this.p = p;
            this.update();
        }
        Progress.prototype.update = function() {
            this.bar.style.width = this.p + '%';
        }
        Progress.prototype.countup = function(data) {
            if (this.p < 100) {
                this.p = Number(data);
            }
            this.update();
        }
        return Progress;
    }());
    
    // 進捗率と進捗バーを更新する部分です
    var updateProgress = function(progress) {
        $.ajax('./hogehoge/percent.log', {
            dataType: 'text',
            success: function(data) {
                $('#progress').html('進捗状況: '+data+'%');
                    progress.countup(data);
            }
        });
    }
    
    // 今回はsubmitが2つあるためclickとボタンのID(#register)で処理します
    // 10秒ごとにInsert≒進捗率変更なので1秒ごとに取得すれば十分かなと思いそう設定しています
    $('#register').on('click', function() {
        $('#progressArea').html('<div id="progressBar" class="progress"><div class="progressBarBody"></div></div>');
        var progress = new Progress(0);
        $('#progress').html('進捗状況: 0%');
        setInterval(function() {
            updateProgress(progress);
        }, 1000);
    });
    
  • 뷰에 표시 (이것도 정말 php 파일)

  • view.html
    
    <!-- 進捗状況表示 -->
    <div id="progressVal">
        <span id="progress"></span>
    </div>
    <div id="progressArea">
    </div>
    
  • 진행률 막대 CSS (디자인에 맞게 조정하십시오)

  • style.css
    
    .progress {
      width: 60%;
      height: 30px;
      background-color: #F5F5F5;
      border-radius: 4px;
      box-shadow: inset 0 1px 2px rgba(0,0,0,.1);
    }
    
    .progressBarBody {
      transition: width 0.5s linear;
      height: 100%;
      background-color: #337AB7;
      border-radius: 4px;
    }
    

    참고


  • 진행 바는 이쪽을 참고로 했습니다
    h tps://쿠로에ゔぇry다 y. bgs포 t. 이 m/2016/03/p 로그 뻗어 r. HTML
  • 좋은 웹페이지 즐겨찾기