再び、競馬の解析のPHP作成を再開しました。前はサイアーラインから色分けした血統表を作成、ってところまで作ったので、とりあえず保留。これからはオッズと着順の関係を条件ごとに検索できるシステムをちょくちょく作っていきたいと思っています。今はURL指定すれば自動で10000件くらいのレースのデータを取って来れるようにはなりました。次は取ってきたデータを解析するところを作っていきます。
話は変わってこのブログで一番アクセスが多いのがPHPのプログレスバー関連の話なので、gdgdだった前回の説明を補足、簡略化する意味で再び解説していきたいと思います。
プログレスバー?競馬の解析をする際、情報はネットからスクレイピング(必要な部分だけ抽出してくること:
はてなダイアリー)していますが、単純にウェブサイトを読み込む時間が必要なので、如何にブロードバンド時代と云えど100ページとか読み込むには相当な時間がかかります。しかもPHP側で特に何もしないと、果たして動いているのか動いていないのか分からないです(もしかしたらエラーが起きているかもしれない…)。そこでWindowsなどでファイルを移動するときに移動状況を表してくれる”アレ”がPHPでも使えたら便利じゃないか!まさにその”アレ”こそ、プログレスバーなのです。
タイムアウトするんだけど?長い処理をするとタイムアウトしてしまうので、それを防がないとなりません。
set_time_limit(0);
こんな記述を冒頭に入れてあげましょう。
PHPの知識だけでできるの?
PHPの知識を持ってらっしゃる方は、大体HTMLの知識も持っていらっしゃると思います。プログレスバーは、PHP+JavaScriptで実現するのです。つまり、
PHPでJavaScriptの関数を呼出 ⇒ JavaScriptでプログレスバーを動かす
といったことをやるわけです。それではPHPからどのようにして、JavaScriptを動かせば良いのでしょうか?
JavaScriptの準備
簡単のために、まずはテキストが表示される例を作成してみましょう。HTML側には以下のような記述をしてください。
<span id="msg"></span>
<script type="text/javascript">
function changeMsg(msg) {
document.getElementById("msg").innerHTML = msg;
}
</script>
このchangeMsg()関数をPHPから呼び出し、<span>タグの中身を書き換えるわけです。
バッファについてPHP側の記述を紹介する前に、「バッファ」について学んでおきましょう。バッファとはパソコンが処理をする際にそのデータを一時的に蓄えておくところのことです(
パソコン用語 - バッファとは)。PHPで意識しなければならないバッファは2種類あります。1つ目はサーバー側のバッファで、PHPで処理しているデータを向こうが処理が完了するまでためている、なんてことがあったら処理が完了するまで途中経過のデータが見れないことになってしまいます。2つ目はブラウザ側のバッファです。読み込みが遅くて画面が真っ白だから、もうや~めた、と思って中止ボタンを押すと、途中まで表示された!なんて例を挙げてみると分かりやすいのではないでしょうか。これらを吐き出させるためにPHPで次の2行を記述しなければなりません。
ob_flush();
flush();
バッファをフラッシュ(水をどっと流す)してあげる記述です。
PHPからJavaScriptを呼び出す!いよいよここまで来ましたね。さぁ、どうするんだ!といった感じですが、実は至って簡単なのです。
$com = "表示したい内容"
echo '<script type="text/javascript">changeMsg("' . $com . '")</script>';
Quick Lookup:
これだけです。ボブ風にいうと(ボブ知らなかったらすみませんww)、ほら、簡単でしょう?と言った感じですね。そして、お友達も書いてあげましょう、といった感じで、
sleep(1); // 重い処理する場所
$com = $i . "/" . $total; // $i: 処理中のデータ番号 $total: データ総数
echo '<script type="text/javascript">changeMsg("' . $com . '")</script>';
ob_flush();
flush();
こんな風にしちゃえばOKです。いかがでしょうか?思ったよりも簡単ですよね。具体例を挙げると、
$i=1;
foreach($url as $urls) {
getDataFromURL($url);
// ($urlのページからデータを取ってくる自分で定義した関数)
$com = $i . "/" . count($datas);
echo '<script type="text/javascript">changeMsg("' . $com . '")</script>';
ob_flush();
flush();
}
こんな感じです。
プログレスバーに応用したい場合は、JavaScript側で工夫さえすればPHPで何もする必要はありません。
PHPにおけるプログレスバーの実現でプログレスバーを動かすサンプルを置いてあるのでぜひそちらも見てみてください。
コメント
good site!
コメントする