カテゴリー : バグ
携帯のユーザエージェントから様々な情報を引き出すことのできるPEAR::Net_UserAgent_Mobile とても便利で利用させてもらってます。 結構ながいこと地味な開発が続いて、2009年にstableとなったんだけど、まだ致命的なバグがある。 例えば下記のスクリプト <? require_once('Net/UserAgent/Mobile.php'); $user_agent = 'DoCoMo/2.0 N900iS(c100;TB;W24H12)'; $agent = Net_UserAgent_Mobile::factory($user_agent); print "キャリア: ".$agent->getCarrierLongName()."\n"; print "機種:".$agent->getModel(); ?> ユーザエージェントを $user_agent='Vodafone/1.0/V705SH (compatible; Y!J-SRD/1.0; http://help.yahoo.co.jp/help/jp/search/indexing/indexing-27.html)'; に変えると Fatal error: Call to undefined function: getcarrierlongname() とエラーになってしまう。 自分で解析できないユーザーエージェントだと、無視せずにエラーを返して強制終了してしまう。 このバグは致命的。先々未知のユーザエージェントは続々と登場するわけで、その度にエラーが出ることになってしまう。 調べてみると、かなりの人が同じ症状で困っているし作者にバグ報告もされているが、その場しのぎで根本的な問題が修正がされることなくstableとなった。 対処方法 <? require_once('Net/UserAgent/Mobile.php'); $user_agent='Vodafone/1.0/V705SH (compatible; Y!J-SRD/1.0; http://help.yahoo.co.jp/help/jp/search/indexing/indexing-27.html)'; $agent = Net_UserAgent_Mobile::factory($user_agent); if (method_exists($agent,'isNonMobile')){ print "キャリア: ".$agent->getCarrierLongName()."\n"; print "機種:".$agent->getModel(); } のように if (method_exists($agent,'isNonMobile')){ ~ } でラップしてスルーさせればOK - [ 続きを読む ]
数カ月前からウェブサーバのトラフィックの上がりが、ノコギリ状に増えている問題があった。 状況としては NFSのreadが定期的に頻発している。 NFSのwriteも中長期で見ると右肩上がり 短期で見ると特徴的なノコギリ波形を示す 1時間に3~4回ペースで定期的に急激なNFS read/writeが生じている。 NFSの微々たるreadだし、放っておいてもサービスにはまったく問題ないんだけど、グラフが汚れて見辛いので原因追求。 長中期で見るとreadの回数は調子こいて右肩上がりのまま留まることを知らないので、このままエスカレートしていくのを放っておくわけにもいかない。 犯人の追跡開始。 ・apacheのログ解析では不明だった ・mod_securityでPOSTを取ったが問題は見当たらなかった そのため ・tcpdump port nfs -nxXs 6000 | grep read -C 20 ・sar -n NFS 1 0 を同時に記録して解析を進めていくことにした。 ・sarで30秒間ほど急激なreadが定期的に発生していることを確認。 ・一時的にreadが急激に上がった時間をメモしておく 10時36分31秒 10時51分39秒 11時05分58秒 11時21分14秒 11時36分03秒 次に、上記時刻のtcpdumpのhexdumpをみてみる。 すると11時21分17秒に一意のデータである特定キーワード(メールアドレス)が確認できたので、これを鍵にすることにした。 ・ファイルサーバーからこのメールアドレスを全ファイル検索 grep -r 'drfadsee3@yahoo.com' ./ その結果 バイナリー・ファイル./ユーザA/blog/db/comment.email.idxは一致しました バイナリー・ファイル./ユーザA/blog/db/comment.dbは一致しました とユーザAのウェブスペースにこのメールアドレスを含むファイルがあることが判明。 ユーザAのアクセスログからPOSTしている時間だけ抜き取ってみた。 するとメモした時間とアクセスログのPOSTの時間が一致した。 ・apacheのログ grep ユーザA apache_log | grep blog | grep POST 09:18:13 :31367: [gw4.winserversecure.com] 85.17.145.7 ユーザーA POST /blog/mt-tb.cgi/145 HTTP/1.0 500 - 09:20:20 :31153: [93.174.93.58] 93.174.93.58 ユーザーA POST /blog/mt-comments.cgi HTTP/1.1 500 - 09:35:41 :9147: [93.174.93.58] 93.174.93.58 ユーザーA POST /blog/mt-comments.cgi HTTP/1.1 500 - 09:50:56 :21595: [93.174.93.58] - [ 続きを読む ]