PHP、Smarty、ケータイサイトについて発信中。書籍 「Smarty動的webサイト構築入門」(技術評論社) 好評発売中
RSS icon Home icon
  • 処理時間が長いとき、すばやくページ表示したい(3)


     フォーム送信後、サーバ側の処理時間が長いとき、なかなか画面が変わらないことがあります。サーバ側の処理時間が長いときでも、すばやくページを表示するいくつかの方法について説明します。

    (3) 簡単な方法 (進行状況を表示する)

     初回の(1)は、flush()を使って「処理中です」をすばやく表示しますが、進行状況はわかりませんでした。今回は、textaeraとjavascriptを使って、進行状況を表示します。

     ページ遷移は form.html ⇒ task.php  となります。thanks.htmlへページ移動しないのは、進行状況を表示したままにしたかったからで、他の理由はありません。必要であれば、thanks.htmlへページ移動することも可能です。

    3_1 3_2

     task.phpは、進行状況表示用のtextareaを含むページを表示して、flush()します。その後、処理のところどころで、javascriptを吐き出します。そのjavascriptが、textareaに進行状況を表示します。デバグや確認用のprint文をちりばめるのと似ています。

    <html>
    <body>
    <!-- dummy dummy dummy dummy dummy dummy dummy dummy  -->
    <!-- dummy dummy dummy dummy dummy dummy dummy dummy  -->
    <!-- dummy dummy dummy dummy dummy dummy dummy dummy  -->
    <!-- dummy dummy dummy dummy dummy dummy dummy dummy  -->
    処理中です<br />
    <textarea id="progress" rows="15"></textarea>
    <?php
    flush();
     
    for ( $i = 0; $i < 10; ++$i ) {
     progress( "step1: $i" );
     sleep(1);
    }
     
    progress( "step2: " );
    sleep(1);
     
    progress( "step3: " );
    sleep(1);
     
    progress( "Finished" );
     
     
    function progress ( $i_msg ) {
     $msg = escape_js( $i_msg );
     print '<script type="text/javascript">';
     print "document.getElementById('progress').value += '$msg\\n';";
     print '</script>';
     flush(); //★重要★
    }
    
    function escape_js( $i_buf ) {
     // 参考:smartyのescape修正子 {$x|escape:javascript}
     // smarty/libs/plugins/modifier.escape.php
     $replace_pairs = array(
      '\\' => '\\\\' ,
      "'"  => "\\'"  ,
      '"'  => '\\"'  ,
      "\r" => '\\r'  ,
      "\n" => '\\n'  ,
      '</' => '<\/' 
      );
     $buf = strtr($i_buf, $replace_pairs);
     return $buf;
    }
    ?>
    </body>
    </html>

     今ある仕組みを少し改造することで、進行状況を表示できるようになります。

     また、サーバ側にキャンセルという仕組みを用意する必要がありません。ブラウザの[中止]ボタン、[閉じる]ボタン、キャンセルページへのリンク、どれでも途中停止します。

    実験ページ(3)

    2009-04-05 aoki No comments 02.PHP

    Leave a reply