青木ITプランニング
PHP、Smarty、ケータイサイトについて発信中。書籍 「Smarty動的webサイト構築入門」(技術評論社) 好評発売中
-
処理時間が長いとき、すばやくページ表示したい(3)
フォーム送信後、サーバ側の処理時間が長いとき、なかなか画面が変わらないことがあります。サーバ側の処理時間が長いときでも、すばやくページを表示するいくつかの方法について説明します。
(3) 簡単な方法 (進行状況を表示する)
初回の(1)は、flush()を使って「処理中です」をすばやく表示しますが、進行状況はわかりませんでした。今回は、textaeraとjavascriptを使って、進行状況を表示します。
ページ遷移は form.html ⇒ task.php となります。thanks.htmlへページ移動しないのは、進行状況を表示したままにしたかったからで、他の理由はありません。必要であれば、thanks.htmlへページ移動することも可能です。

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>今ある仕組みを少し改造することで、進行状況を表示できるようになります。
また、サーバ側にキャンセルという仕組みを用意する必要がありません。ブラウザの[中止]ボタン、[閉じる]ボタン、キャンセルページへのリンク、どれでも途中停止します。
Leave a reply



最近のコメント