Twitter Toolsで日々のダイジェストを自動投稿しているわけですが、ほぼ毎回、投稿が重複してしまうので困っています。ずっと以前から同様の問題で頭を悩ませている方々も多いようですが、結局きちんと解決できていることがないような。
ということで、ようやく自分でも回避策を検討することにしました。
まずはデバッグを…こちらの記事 TwitterTools Daily Digestの多重投稿問題 と同様に、 ping_digest() あたりで error_log() を仕込んで ping_digest() の呼び出しタイミングを確認します。
ダイジェストを投稿する時間以降に httpd の error_log を確認すると、アクセスしたユーザとサーバ自身のクライアントアドレスが記録されているので、どうやらそのせいで重複投稿している感じ。複数のタイムゾーンで投稿しているのではないようです。
さて、回避策の方ですが… ping_digest() ではなく aktt_ping_digests() 自体をスキップさせてしまっていいんじゃないかな、ということで、ここに REMOTE_ADDR の判定を入れてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function aktt_ping_digests() { // 2012/04/01 add remote_addr check code. $dbg_rmt_addr = $_SERVER['REMOTE_ADDR']; $dbg_my_addr = 'xxx.xxx.xxx.xxx'; $debug_ident = "### DEBUG : twitter-tools:aktt_ping_digests()"; error_log("$debug_ident: called.", 0); if ( $dbg_rmt_addr === $dbg_my_addr ) { error_log("$debug_ident: client addr is $dbg_rmt_addr, skip ping_digests().", 0); return; } global $aktt; $aktt->ping_digests(); } |
少々強引だけど、 REMOTE_ADDR がサーバ自身の IP アドレスにマッチしたら即 return させれば、ユーザのアクセス分だけ ping_digests() を叩くハズ…なので、これでどうだろう? low tech なのは気にしない。 ;-P
チェック用に error_log() でログ出力して確認中。回避策が効いていそうなら、 error_log() は止めてしまおう。