PHP温故知新 − PHPはバッチ処理ができなかった

ほんの1年か2年くらい前まで、PHP言語には致命的な弱点があった。 バッチ処理ができなかったのだ。 いや、できなかったというと語弊があるので正確に言うと、 昔のPHPでバッチ処理をするような機能をつくるのにはかなりコツがいり、 場合によっては非常に難しかった。

掲示板のようにごく簡単なWebシステムであればバッチ処理の必要がない (あるいは運用でなんとかなる程度)ため、この問題を意識することはないのだが、 ちょっと複雑なWebシステムを作ろうとすると頭を悩ませることになる。

先に言っておくと、現在のバージョンのPHPはバッチ処理もできるようになっているので安心してほしい。 以下、Webシステムにおける画面処理とバッチ処理の違いや、 Webサーバそのものの構造とPHP言語との関連について極力わかりやすく書いておきたい。 わかりやすくとはいっても内容が内容なのでどこまでわかりやすいかは自信無いが。

比較的複雑なWebシステムとして代表的な、オークションサイト=たとえばYahoo!オークションとか=を例にしながら説明してゆこう。

Webシステムの機能には大きく分けて画面処理とバッチ処理がある。 バッチ処理は日本語で書くと「一括処理」という意味あいだ。 オークションサイトで言えば、まず、それぞれの出品物の画面を表示することそのものが画面処理である。URLに含まれた「a1234567」といったオークション番号をもとに、データベース(あるいはそのキャッシュ)から該当する出品物の情報を引き出し、HTMLに整え、ブラウザに返す。 その人がログインしているかしていないか、出品者か入札者かどちらでもない人か、によっても出力するHTMLの内容は違う。

「入札する」というのも画面処理のひとつだ。 金額を入力し、「入札」ボタンを押すと入札の記録がデータベースに書き込まれる。 「現在はあなたが最高額入札者です」と画面に表示されるようになる。 ついでに、すでに入札していた人に「ほかの人がさらに高値で入札したようですよ」というメールを発信する。

問題は、オークションが終了する場合だ。 Yahoo!オークションでは、希望価格に達したとかいう例外を除き、通常は、オークションの終了=終了時刻になったとき、である。

では、いったい誰が、「オークションの終了」という処理を行うのだろう? Yahooの担当者がじーっと時計を見ていて時間がきたらなんらかの画面上の「終了」ボタンを押すのだろうか? まさか(笑)。 そう、こうした処理は画面処理ではできないのだ。そこでバッチ処理の出番となる。

バッチ処理にもいろいろあるが、この例で言うとオークション終了バッチ処理が1分ごとに自動的に起動され、その時刻がオークション終了時刻として設定されているオークションをすべてピックアップし、終了処理を施す=画面から「入札する」ボタンを消し、 出品者と最高額落札者にそれぞれオークションの終了を知らせるメールを出す。

ひらたく言えば、「画面を見る」とか「画面のボタンを押す」といった人間の手による動作が必要なのが画面処理で、コンピュータ勝手に動き出してやりたいことを一気にやってくれる処理がバッチ処理と言える。 (バッチ処理であっても手作業で起動するケースももちろんあるが、たいていは自動起動である)

では昔のPHPはなぜこのバッチ処理ができなかった(やりづらかった)のだろうか? 続けて書いてしまおうと思ったのだが思ったより長くなってしまったので次回に続く。

トラックバックURL

このエントリーのトラックバックURL:
http://www.ywcafe.net/mt/mt-tb.cgi/349

コメントする

(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)


画像の中に見える文字を入力してください。