PHPでファイルアップロード時に進捗を表示するProgress barの実装をやってたりする。
PHP5のAPC(Alternative PHP Cache)で、ファイル送信時の情報取得が使えるようになったのだが、サーバがPHP4のシステムで動いているので、PHP5に置き換えられない。
PHP4とPHP5の同居が必要なのと、Apacheでモジュールを組み込むにしても、mod_phpは4と5を同時に組み込む事ができないので、それぞれを組み込んだApacheを動かす必要がある。
通常動かしているApacheとは別にもう1個別portで動かして、特定のURL以下をreverse proxyで置き換えなんてトリッキーなやり方で動作環境は確保した。
で、Progress barのソースサンプルを入手して実装しようとしたのだが、非常に難解な組み方をしていて、「何かあるな」という感じはしていたのだが、別に気にせず、原理を理解して、Ajaxのprototype.jsを使ってコードを書いた。
しかし、safariでテストした時、全然動かない。
非同期通信で呼ばれるPHPスクリプトのアクセスログが発生せず、Progress barを表示するページで、formにAjax.requestの処理の入った関数が呼ばれているかを吐き出すようにしてみると、ちゃんと呼ばれている。
しかし、Ajax.requestの行だけ、全く無視された状態になっていた。サンプルだと動く。サンプルは、ページ遷移しないか、一部が遷移するようになっていて、非同期通信でAPCの情報を取得しているのは、遷移しない部分…。
ここで、サンプルがなぜ難解な方法で組まれているのか全てを理解した。
APCの情報を取るのに、一部のブラウザではページ遷移が起こる場合、Ajax.requestなどの非同期通信のjavascriptコードが一切動かなくなるのだ。
根本的に構造の見直しが必要で、ほとんど一から作り直し(笑)
まあ、なんとかでっち上げつつあるが、今はIE6で後方互換モードでないと表示しないとかしょうもないブラウザのバグの対処に当たっている。
暫く、SI業から遠ざかっていたから動向を良く知らなかったが、Microsoftは相変わらず、世間に迷惑をかける実装を続けていたのか。実にMicrosoftらしいと感心する事しきり(笑)。