TwitterOAuth( https://github.com/abraham/twitteroauth )でpost時にNoticeErrorが発生して困った件。
TwitterOAuth::postメソッドコール時に以下のようなNoticeエラーが発生する。
Notice Error: Undefined offset: 1 in [/(略)/abraham/twitteroauth/src/TwitterOAuth.php, line 320]
問題は、処理側でtry catch で例外処理ができないこと。
原因は、たぶんライブラリ側でローレベルでPOST処理したときに、レスポンスが返ってこなかった時の処理が抜けてるんじゃないかなと思われます。
ライブラリを治すのがセオリーなんですが、あんまりライブラリはいじりたくない&ぱっと見どうすればいいかよくわからない。
最新のコードを見てみたのですが、だいぶ変わっているみたい?なので、最新にすれば治るのでしょうが、他の部分に影響があるとまずいので、今回はラッパーをかましました。
/** * Twitter API Post処理 * POST処理を行う。エラー時は1秒待ち3回まで再送処理を行う */ function _dm_send($tw,$params){ $count = 0; $maxTries = 3; while (true) { try { $result = $tw->post("direct_messages/new", $params); if(empty($result)){ //パラメータエラー発生時の処理 throw new Exception("パラメータエラー"); } return $result; } catch (Exception $e) { if (++$count === $maxTries) { //例外処理 var_dump("送信時エラー{$e->message}"); exit; } var_dump("DM送信エラー::リトライ{$count}"); sleep(1); } } return false; }
レスポンスが空になるようなので、それを検知。とりあえず、1秒待って3回までリトライするようにしました。
同にも動かない場合はfalseを返すことにしました。
このままだとNOTICEエラーが出ちゃいますが、今回はそれでも問題ないのでそのままにしておきました。