せっかくなので書き残してみた程度の記事です。ご了承ください。
何を作ったのか
サマーウォーズファンなら何度も見た事があるであろうこのシーンを、Twitterのタイムラインから取得したツイートで再現するものを作ってみました。
Github https://github.com/come25136/OZtter
Raspberry Pi b+ で試用公開しています https://oztter.f5.si
OZtterをホスティングしている方が「URL載せていいよー」と言ったので https://oztter.riku6460.space/normal/
[追記] OZtter2作りました
GitHub https://github.com/momizicode/oztter2
こちらはNode.jsで作り直してます https://oztter2.momizi.work
[更に追記]
TwitterがUser Streams APIを廃止したので動きません
[また追記]
Mastodon版作りました
https://bl.ocks.org/come25136/raw/ef1e8c41ac87cc70a7b873539691782e/
なぜ作ったのか
暇だったから
サマーウォーズの世界観を味わってみたかったから。
PHPで何をどう実装したのか
サーバーからクライアントへのデータ受け渡し方法はSSE(Server-Sent Events)を採用しました。
なぜWebSocketではなくSSEを採用したのか
クライアントからサーバーへデータを送る必要がなかったから。
PHPでWebSocketが扱いにくいとか決してそういう訳ではない
Nginx側のバッファ処理でハマった
header("X-Accel-Buffering: no");
この一行で解決しました。
Twitter OAuth認証はどうしたの?
@mpyw 氏作の cowitter を使わせて頂きました。
サーバー側ではどのような処理をしているのか
Twitter Streaming API で取得したユーザータイムラインをSSEを使ってクライアントへリレーしているだけです。
https://github.com/come25136/OZtter/blob/master/push.php
なぜサーバーが必要なのか
Twitter API Key が漏れる心配がないからです。
完全に心配がないとは言い切れませんが、クライアントのみでTwitter Streaming APIを使用した場合、JavaScriptに直接API Keyを埋め込む必要があるので、API Keyが漏れる可能性が高くなります。というか漏れます。
サーバー側の負荷について
負荷は同時クライアント接続数に比例します。
が、今回はコネクションが常に繋がっている状態なので、普通の負荷と思って考えると予想を超えます。
Raspberry Piにとっては地獄ですね (;´∀`)
最後に
PHPはいいぞ
とか言うと他の言語を使っている人に怒られる戦争を仕掛けられるので、あまり大声では言えませんが(笑)
[追記]この記事を書いてから1年経ったので一言
最近はJS触りながらロリコン発言しています。