お詫び-ついめ〜じのサーバ落ちについて(追記あり)

なんとありがたいことに、あのグッドスマイルカンパニー様が「ついめ〜じ」をtwitter企画のページに使っていただけた!
しかし、こちらのミスでtwimg.infoサーバ本体のほうが落ちてしまって…ユーザー様に申し訳ない!
今回のサーバ落ちはアクセス過多でなく、前からやろうと思っていたベーシック認証からの移行のためのスクリプトがミスで負荷がかかってしまい、サーバ側に止められてしまったというものです。スクリプト自体は修正しましたが復旧は10日の10時以降になると思います。
これは単体のテストなら特に気づかなくて、(重いけど動くので)大規模で動かしてみて、やっとわかる…みたいな感じなので
最初はアクセス多すぎて…と思っていたのですが、ログを見るとどうやら違う。前々日の夜にした改変が改悪になっていて、転送量でなくミスで負荷をかけていたのだと判明しました。

必死こいて修正し、キャッシュも工夫し、APIも食いつぶさないようにしてみました。

プログラマとして本当に恥ずかしいですがキャッシュのことや、負荷や無駄をかけないつくりが大事な事が、身にしみてわかりました。

サーバの管理者さんとサーバの皆さん、画像が見れなくなってしまったユーザーの皆さん、グッドスマイルカンパニーの皆さんには心からお詫び申し上げます。

ひとりでもこんな失敗、同じ轍を踏まないよう、失敗したところと行った対策を書いておきます。怒られる覚悟で。反省しています。

以前

$host = "http://twitter.com/users/show/"."$id".".xml";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $host);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

//////cURLセッションを実行する
$xml = curl_exec($ch);
curl_close($ch);

$line = @simplexml_load_string($xml);

curlでユーザーのタイムラインをとっています。twitterプログラムやりはじめて最初頃なのでまるまるコピペですね。
ユーザー名とパスワードでbasic認証しているので、近く使えなくなる、ということで書き直したのが…

やってはいけない!高負荷なダメな例

$xml = "http://twitter.com/users/show/"."$id".".xml";
$line = @simplexml_load_file($xml);

これでも取得できるんです。よく見ると、関数が違います。simplexml_load_stringと、simplexml_load_file。後者のほうが負荷が高いです。しかもこれでは漏れ無くAPIも消費します。じゃあ軽いsimplexml_load_string使えば?ということなんですが、生のxmlは処理できません。

そこで、

ややマシな例マシではなかったです。追記をご覧ください

$xml = file_get_contents("http://twitter.com/users/show/"."$id".".xml");
$line = @simplexml_load_string($xml);

file_get_contentsを使うことによってsimplexml_load_stringが使えるようになる、だいぶ違います。
しかしこれでもまだ不十分です。ついめ〜じの仕組みはurlが呼ばれるたびにxmlをパースし、更新時間を比較して、更新がなければキャッシュの画像を読み込み、あれば画像を作りそれを表示する。

アクセス数がほどほどのサイトにリンクされているなら大丈夫だが、人気のところだと…

せっかくキャッシュの画像を作っているんだから、短期間のアクセスならば画像の更新時間を比較してxml自体を読み込ませない設定にした。多少遅れるがAPI食いつぶすより遥かにいい。
Cache_LiteというPEARがあるが、同じ感じで実装してみた。

以上が行った対策。根本的な問題ですが、あとはやはり専用サーバ移転ですかね。転送量が…

とにかく、申し訳ありませんでした。復旧早く出来るよう、祈るしか無い…!
すみませんでした。

参考URL

http://blog.caraldo.net/2010/02/pearcache_lite_twitterapi_xml.php

【重要】追記
テストしてみましたところ、file_get_contentsも同様に負荷の高い命令だということがわかりました、
今まで軽く済ませられたのはcurlの恩恵が大きいということでしょうか…ユーザー・パスなしでcurlで処理できるのが一番いいのですが…すみません。というわけで、まだ停止しています。