Web、サーバ、ソフトウェア、バグ・脆弱性 などの情報を何人かで集まって書いていく IT/Web情報系ブログ

SNS Count Cacheで全くキャッシュされない時の対処法

投稿日:   投稿者:ktm@s

個人的にはブログは書きたいことを書く事のみが重要で、デザインはそれなりに表示されたら良い。
だからテーマの自作とかは一切無く、情報量が多くてカスタマイズが楽なSTINGER5テーマを使用し、大体のことを既存の記事からのコピペとプラグインで済ませている。

シェア数とボタンの表示に関しても同様で、今回は以下のページからデザインを流用させてもらうことにした。

さらなる高速化を。自作SNSボタンをキャッシュしよう

しかし「SNS Count Cache」を導入した段階で、どの設定にしてもいくら時間を置いても動作せず非常に困った。

この記事では解決に至るまでのあれやこれやをやった順番に書く。
サックリ結論だけ見たい人は目次からそれっぽいところにジャンプして欲しい。

なお、SNS Count Cache0.4.0で急に動かなくなったよ!って人は、ここじゃなくてこちらの方の記事が適切だと思う。

SNS Count Cache 0.4.0でキャッシュが取れなくなった場合

挿入箇所がわかんないよって人は、記事中で指定されているphpファイルから「curl_setopt」で検索したら似たようなのがズラっと並んでいてわかる。

永遠にキャッシュを始めないSNS Count Cache

指示に沿って SNS Count Cache をインストールしたものの、一向にキャッシュが始まらない。気配も無い。

SNS Count Cacheでno cacheになる

SNS Count CacheでN/A

スポンサーリンク

設定変更を試す

致命的に動作に関わりそうな設定というのも見当たらないが、Setting タブから「Interval cheking and caching share count (sec)」を小さめな数値にしてみたり、「Dynamic caching based on user access」を作者推奨の設定に変えてみたりしたが、SNS Count Cacheは沈黙を守り続けるのだった。

バージョンダウンして試す

バージョンを1つ落として0.3.0(だったと思う)を試すもSNS Count Cacheは沈黙を守り続けるのだった。

手動キャッシュ機能を試す

再び最新の0.4.0に戻し、0.4.0から実装された「手動キャッシュ機能」を試してみることにした。

cacheボタンを押してみると、プラグイン設定側が真っ白で何も表示されない。
ははあ。サーバ側に何か足りてないな?

とにかくカウント数を表示させたいのだ

完全に個人的なブログなのでテスト環境などは作っていない。
面倒だしCSSも何もかも大体あってるだろうと全て上書きぶっつけ本番という「漢」スタイルで更新している。

つまり現状ではSNSアイコンとカウント表示用のバルーンだけ表示しており、中に数字が書かれることなくバルーンが潰れているという状態だ。

SNS Count Cacheとかどうでもいいから、何よりもまずはこのバルーンの中に数字を入れたい。

APIを叩いて持ってくる

同じサイト(えじの自由帳)にSNS Count Cacheを利用しないコードがあったのでひとまず応急処置する。

SNSボタンのデザインがばらばらだったので自作してみた。(Stinger5カスタマイズ)

Feedly用に自サイトのFeedURLを入力するだけで後はコピペだけで済むので非常に簡単だ。

APIを直接叩いても取得できないよ?

SNS Count Cacheを利用せず、各APIから直接拾ってくる方式でもカウント数が取得できない!

というか、ページのSNSボタンを表示しているより下のhtmlが出力されていない!
これはsns.phpの処理中にどこかで停止していると思われる。

場所が判っているのならば後は地道に切り分けるのみ。

問題箇所の切り分け

sns.phpに書いた(コピペ)したカウント取得部分のコードはこのようになっていた。

<?php
//Twitter
$url = get_permalink();
$json = @file_get_contents('http://urls.api.twitter.com/1/urls/count.json?url='.rawurlencode($url));
$array = json_decode($json,true);
$tw_count = $array['count'];

//facebook
$url = get_permalink();
$json = @file_get_contents('http://graph.facebook.com/?id='.rawurlencode($url));
$array = json_decode($json,true);
if(!isset($array['shares'])){$count = 0;}else{$count = $array['shares'];}
$fb_count = $count;

//google+
$url = get_permalink();
if(isset($_GET['url'])) $url = $_GET['url'];
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, "https://clients6.google.com/rpc?key=AIzaSyCKSbrvQasunBoV16zDH9R33D88CeLr9gQ" );
curl_setopt( $ch, CURLOPT_POST, 1 );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch, CURLOPT_POSTFIELDS, '[{"method":"pos.plusones.get","id":"p","params":{"nolog":true,"id":"' . $url . '","source":"widget","userId":"@viewer","groupId":"@self"},"jsonrpc":"2.0","key":"p","apiVersion":"v1"}]' );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Content-type: application/json' ) );
$result = curl_exec( $ch );
curl_close( $ch );
$obj = json_decode( $result, true );
if(!isset($obj[0]['result']['metadata']['globalCounts']['count'])){$count = 0;}else{$count = $obj[0]['result']['metadata']['globalCounts']['count'];}
$gp_count = $count;

//hatena
$url = get_permalink();
$count = @file_get_contents('http://api.b.st-hatena.com/entry.count?url='.rawurlencode($url));
if(!isset($count) || !$count){ $count = 0; }
$hb_count = $count;

//feedly
$feed = '【自分のフィードへのリンク】';
$feed = rawurlencode($feed);
$json = @file_get_contents("http://cloud.feedly.com/v3/feeds/feed%2F{$feed}"); 
$obj = json_decode($json,true);
if(isset($obj['subscribers'])){$count = $obj['subscribers'];}else{$count = 0;}
$fe_count = $count;
?>

まずはこの中でもどのカウントを取得する時に問題が起きているかを把握する。

全パターン試した所によると、どうやらgoogle+だけ取得できないようだ。
Google+だけカウント数取得する為のAPIが無いとかそういう話か。

Google+部分だけ削除した状態で他のカウント数は正常に表示することが出来た。

次に問題が起きている箇所の中でもどこがダメかを考える。
単純に変数の中身を見ていく。

//google+
$url = get_permalink();
if(isset($_GET['url'])) $url = $_GET['url'];
//echo $url; true

$ch = curl_init();
//echo $ch; false

curl_setopt( $ch, CURLOPT_URL, "https://clients6.google.com/rpc?key=AIzaSyCKSbrvQasunBoV16zDH9R33D88CeLr9gQ" );
curl_setopt( $ch, CURLOPT_POST, 1 );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch, CURLOPT_POSTFIELDS, '[{"method":"pos.plusones.get","id":"p","params":{"nolog":true,"id":"' . $url . '","source":"widget","userId":"@viewer","groupId":"@self"},"jsonrpc":"2.0","key":"p","apiVersion":"v1"}]' );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Content-type: application/json' ) );
//echo $ch; false

上記を見るに、$ch = curl_init(); がまともに動いていないことになる。

curl・・・

(これで解決)もしかして:curl

自分でWordPressを使う環境は大体自分で構築している。
自宅サーバかVPSが基本で、他に使っても知り合いの自宅サーバという状態。
無駄なパッケージは一切入れない。

一般的レンタルサーバはどうかしらないが、curl_init(); がダメって事は、php5-curlが入ってないって事なんじゃあないの?

sudo apt-get install php5-curl

インストールして試してみると、当たり前のようにGoogle+カウント数を引っ張ることが出来た。

ひょっとしてSNS Count Cacheも動くんじゃ?

Google+のカウントが引けない理由はサーバ側にphp5-curlが入ってない事にあった。
そしてGoogle+のカウント数をスムーズに引っ張ってこられるGoogleが提供するAPIは無いようだ。

って事は、(面倒だからソース読まないけど)SNS Count Cache側も似たような取得方法を取っていて、php5-curlが有効に無いから動かなかったのでは・・・?

試しにSNS Count Cache 0.4.0をインストールしたところ、瞬く間にキャッシュした。
シェア数表示も最新のコードに戻さにゃならんね・・・。

あとがき

「SNS Count Cache キャッシュされない」や「SNS Count Cache エラー」で軽く調べても全く解決しなかった。
どこのサイトでもSNS Count Cacheは動いて当たり前って感じだったし、「キャッシュされない」が候補として表示されるのに妙な感じだな・・・と。

今回はVPSでApache2やPHP周りを設定した時に必要最小限にしていたのが罠になった。
VPSや自宅サーバの人でこの記事にたどり着いた人は同じ理由かもしれないね。

レンタルサーバの人で同様に全くキャッシュしない人は、phpinfoで確認してみると良い。
以下のコードを適当な名前で保存してアップロード後に実行してみよう。

<?php
phpinfo();
?>

- プラグイン , ,

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事