にゃあ

Cometを実装していて竜ヶ峰帝人のウェブ技術に脱帽した

注:ネタバレがあります。

私が、デュラララ!!のチャットを再現する道のりは、竜ヶ峰帝人がダラーズのサイトを立ち上げたものを後から追っていくようなものだ。

竜ヶ峰帝人は、池袋でオフ会をしてあれだけのメンバーが集まるようなコミュニティサイトを立ち上げたんだから、きっとチャットもCometを実装したに違いない。彼の足跡を辿るようにして、私もCometの実装にとりかかった。Cometの実装パターンはいろいろあるが、その中でも一番修正が少なくて済みそうなXHR long-pollingという方法をとることにした。

この方法をPHPでやるとすると、AjaxでPHPにリクエスト → 新しい発言があるまでPHPが無限ループ → 発言が見つかるとデータレスポンスを返す → クライアントがデータを料理して表示 → 最初に戻る という流れになる。

PHPで無限ループするところでは、sleep(1)をかませるのが王道。一秒ごとに新しい発言がないかチェックするわけだ。しかし、このsleep()関数が第一の鬼門だった。チャットアプリは当然ログインしているわけで、セッションを張った状態になっている。このセッションが張られた状態で、sleep()の無限ループがつづいていると、その後に別のスクリプトに出したリクエストが帰ってこない。これは、どうしたものかと調べてみると、sleep()はスクリプト単位ではなく、セッション単位で機能するということ。とりあえず、sleep()に入る直前にsession_write_close()することで解決できた。

そして、Cometにおいて最大の難関にさしかかる。それはIEの対応。Cometは少なくても2コネクションを同時に使う。ひとつは発言のPOST、もうひとつは無限ループしてるスクリプトへのGET。IEだと、同時に2コネクションしか使うことができない。2個もあれば十分じゃないかと思ったら、チャット中に他のページに行くこと(3つ目のコネクションを作ること)ができないことが分かった。これはたぶんTCPの仕様じゃなかったかと思う。だからIEは間違ってない。FFやChromeが寛大なだけだ。

調べてみると、Cometではこの対策として複数のドメインをたらいまわす方法がとられているらしい。Ajaxではドメインを超えて通信できなので、IFRAMEの出番になる……。

ここまでのことを竜ヶ峰帝人は、高校生にしてやりとげたというのか!私が高校生だったころなんて、オブジェクト指向はおろか参照渡しもわからなかったと言うのに。帝人のウェブ技術に脱帽。


コメント&トラバ

トラックバックを送る

無関係なスパムのトラックバックを防止するため、リンク先で本サイト(suin.asia)への言及が確認されないトラックバックは破棄しています。

トラバURL : http://suin.asia/trackback/458

コメントを書く

お名前* URL
本文*
合い言葉* ←「thesealatcil」と入力して下さい。
* この記事の話題と関係ないコメントはどんな内容でも削除します。(移動できないので)

トラックバック

トラックバックがないのはさみしいにゃん…。

コメント

(2010.04.01) #
なるほど・・IEは確かにWindows仕様に準拠してる点でかなり仕様通りではありますが。

それより、その技術を高校生でって思うと現役社会人でフリープログラマーやってますけど、高校生の時はさすがにVB6くらいしかできませんでした。

さすがですな・・・
名無し(2010.04.01) #
チャット作ったのは臨也じゃね?
エコー(2010.04.01) #
サイト自体は複数人が協力してたてたんじゃないでしょうか!
SDK(2010.04.01) #
あのチャット、レンタルチャットではないかと・・・
管理人が臨也なでけではなかったでしょうか?
ダラーズのチャットとセットンやら甘楽やらがいる所は別ですし・・・
なななんと(2010.04.10) #
これ内緒モード無いんでしょうか?
jack(2010.04.11) #
Apache 2.2
PHP 5.3.2
Sleipnir 2.9.3
で使用したところ
吹き出しのしっぽと音がでませんでした。
suin(2010.04.12) #
> jackさん

音については、readmeを読んでください。
バージョンはいくつですか?吹き出しの尻尾は1.0.3からですが…。
あと、Sleipnirでのテストはやってませんが、SleipnirってIE系でしたっけ?IE系では残念ながらしっぽはでません。
(2010.05.21) #
私に是非このデュラララチャットの作り方を教えて下さい。
お願いします
無理なら諦めます。
suin(2010.05.21) #
> 参さん

設置のしかたはReadMeに書いてあります。
チャットの仕組みはPHPがわかるならソースを読むのが早いです。
(2010.05.21) #
ReadMeってどこにありますか?
何回もすみません・・・
瑠依(2010.06.25) #
私も参さんと同じく、デュラララチャットを作りたいものです。
ReadMeが分からないので、私にもご説明お願いします(><)
↑一応検索はしてみたんですが・・・
 やっぱり分からなかったです・・・
瑠依(2010.06.25) #
あっ! あと、内緒モードも出来ればお願いします・・・
二回もすいません・・・
luna(2010.11.18) #
こんにちは。
lunaと申します。
ノンリロードのチャットの作り方・・なんですが、

手動リロードでなければいいという考えであれば、
「常にリロードしている」という考え方もありだと思います。

これだと常にリロードしているのでリアルタイムに表示
されるかと思います。

実際、「かにチャット」のサンプルにアクセスしてみると、
ずっとローディング中(?)のようなものが出ていました。
(googlechromeでいえば、タブの左側で回ってる状態。)
それを利用して一応自分でkentのチャットをカスタマイズしたら
それなりにできました...

内緒モードは・・難しい・・・。

がんばってください!

Author

Submenu

Recent Entries

XOOPS Cube Dev Ring

氷川 XOOPS Module 開発室

Recent Comments

Recent Trackbacks