[Pz-LkC]リンクカードにソーシャルカウントもキャッシュしてみる

この記事は約13分で読めます。

リンクをブログカード形式で表示する「Pz-LinkCard」(以下、Pz-LkC)をお試し稼働中。

いよいよ始動…?

さて、公式プラグインディレクトリにて公開している、外部リンクをはてなブログカードで表示させるWordPressプラグイン「Pz-HatenaBlogCard」。(以下、Pz-HBC)

外観もカスタマイズできて、自分でも便利に使っていたのですが、やはり「はてなブログカード」の力で表示していることには変わらず。

 

色や配置も変更できないのでした。

というわけで、ひそかに開発をすすめていた Pz-LkC の出番がそろそろ…!Σ(゚ロ゚)o゙

 

というか、「Pz-HBC 直して→要望とか意見もらって→Pz-HBC 直して→うっひょー、楽しい!Σ(゚ロ゚)o゙」ってやっていたので、Pz-LkC は「Pz-HBC ver1.1.0 にキャッシュ機能搭載!」みたいな状態で放置状態でした。

もう、Pz-LkC に手を入れてどうこうできるレベルでは…!Σ(゚ロ゚)o゙

 

というわけで、Pz-HBC ver1.2.5に、DBキャッシュの仕組みを移植して、Pz-LkC として開発していこうと思います。

 

そもそも、「Pz-HBC」は、「外部リンクは『はてブカード』で表示。内部リンクは『はてブカード』に似てるカード形式で表示。」というところが目標でした。

本当は公式プラグインディレクトリに乗っけたあたりで、保守フェイズに入って、「低機能だけど、プログラムもシンプルで不具合が少ない、安心して使えるバージョン」にしようと思っていました(^-^;

 

そして、開発休止中だった Pz-LkC の方をいじっていって、「プラグインがDB更新したり、ちょっとリスクもあるけど、外観もいじれて便利じゃん!Σ(゚ロ゚)o゙」という感じにしていって、差別化を図ろうと思っていたのですが…。

 

「Pz-HBC公開Σ(゚ロ゚)o゙→ズレた→直したーΣ(゚ロ゚)o゙→要望とか→機能追加→不具合発見→直した→こういうの便利?→追加したーΣ(゚ロ゚)o゙→うっひょー、楽しい!Σ(゚ロ゚)o゙」

ああ、平常運転です。

 

言われてもいない機能追加してみてバグ出すところまで含めて平常運転です(ダメじゃん)。

うーん、速い!Σ(゚ロ゚)o゙

テストサイトでしばらく稼働させてみたので、リンクがもっと沢山貼ってある本番サイトでテスト。というか本番稼働してみました。

有効化直後、一回も表示されていないリンクカードは、リンク先から内容を取得してキャッシュを貯めに行くので遅いです。

 

カード一枚につき、1~2秒という感じでしょうか。

同じリンク先が複数ある場合でも2枚目はキャッシュから表示されるので速いです。

(そんなページ、テスト用しか無いか(^-^;)

 

キャッシュされた状態でもう一回開いてみると、今までとは全然違う感じで速く開きました。(^-^)o

「キャッシュすげえぇぇぇぇぇ!Σ(゚ロ゚)o゙」

「速ぇぇぇぇぇぇ!Σ(゚ロ゚)o゙」

そもそも、Pz-HBCの公開と同じくらいに、キャッシュ版も作ってはいたので、速いのは知っていたのですが、その頃は設定画面も無かったので、今の装飾された状態で高速表示されるのは新鮮です。

うーん、遅い!Σ(゚ロ゚)o゙

でも、やっぱりソーシャルカウントはあった方が見栄えが良いです。

 

「ソーシャルカウント、オンっ!Σ(゚ロ゚)o゙」

 

…Σ(゚ロ゚)o゙

 

んーーー、遅い…!Σ(゚ロ゚)o゙

 

きっと、キャッシュが…もう一回…

 

…Σ(゚ロ゚)o゙

 

んーーーーーー、遅い…!!Σ(゚ロ゚;o゙

 

…Σ(゚ロ゚)o゙

 

ソーシャルカウントぉぉぉぉぉΣ(゚ロ゚)o゙

 

ソーシャルカウントは、そのままAPIにつっこんで毎回数値を取得しているので、仮に同じカードが並んでいても、速くなりません。

 

「ソーシャル、オフっ!Σ(゚ロ゚)o゙」→「はやっ!Σ(゚ロ゚)o゙」

 

「ソーシャル、オン!Σ(゚ロ゚)o゙」→「おそっ!Σ(゚ロ゚)o゙」

 

やっぱり、ソーシャルカウントを表示させると、目に見えて遅いです。

「外部リンクもキャッシュしたから高速ブログカード!Σ(゚ロ゚)o゙」みたいな感じで行こうと思っていたのに、「※ただしソーシャルカウントを表示しないときに限る」となってしまいます(^-^;

ソーシャルカウントのキャッシュへの道

自サイト内の記事のソーシャルカウントは、「スケジュールでひっそりカウントを集めて置いてくれて、表示は一瞬!」なWordPressプラグイン「SNS Count Cache」があります。

キャッシュ状況画面で、キャッシュのカウントが一覧できて、「今日は、どのページがソーシャルカウント多いかなー?Σ(゚ロ゚)o゙」とかニヤニヤできます。

※当サイトのカウントはそんなペースでは増えていません。あしからず。

 

自作プラグインから呼び出すときも、function_exeistsで存在チェックしてから使えば、インストールされていればそのまま使えるし、無かったらAPI取得に切り替える、なんてこともできます。

当サイトでは、記事下部のSNSボタンに使用させていただいています。

日本の方が作成されておりますが、元々グローバル向けに英語です。

難しい単語はほとんど無いので、そのまま雰囲気もんで使えたのですが、ちょい前のバージョンで管理画面も日本語化されました。

 

というか、WordPressで自記事のソーシャルカウント表示してるなら、絶対使った方がいいですよ!Σ(゚ロ゚)o゙

 

っていうか、このプラグインの管理画面、きれいでいいなぁΣ(゚ロ゚)o゙

こんなん作れるようになりたい…Σ(゚ロ゚)o゙

 

と、それはさておき、内部記事はこれを使えば、記事中のソーシャルカウントもひっくるめて高速化してくれますが、問題は外部サイトの分!Σ(゚ロ゚)o゙

自サイト内だけじゃなくて、外部サイトのソーシャルカウントも自動更新しておいてくれて、超高速!Σ(゚ロ゚)o゙みたいなプラグインがあれば良いのですが…。

 

「無い物はつくる!」

というのは、X68kユーザーの合言葉のようなものでしたけども。

まあ、Pz-LkC用に作ってしまうのもアリかなぁと思いました。

「SNS Count Cache」みたいに、他のプラグインとかからも使えればいいんだろうし…。

 

「って、需要あるんか?それ?Σ(゚ロ゚)o゙ 」

まあ、あったとしても、自分が取りたいのはせいぜい「Twitter」と「facebook」と「はてブ」、あとは「Pocket」くらいかなぁ。「ぐぐ+」とかやってないしなぁ(^-^;

しかも、Twitter は2015年10月から取得できなくなるとか何とか。

x.com

そんなこんなで、ツイート数取得のAPIもここのところ重かったようです。

しかし、需要あったとしても、管理画面とかつくるの無理ぃ…。

よし。

きゃしゅる!Σ(゚ロ゚)o゙

「このままではイカン!Σ(゚ロ゚)o゙」ということで、ソーシャルカウントの取得結果もキャッシュすることにしてみました。

最初に考えたのが、ソーシャルカウント専用のDBを作成。

id URL service count update
BIGINT VCHAR(2048) VCHAR(32) BIGINT DATETIME
1 https://popozure.info/pz-hatenablogcard tw 16 2015/09/23 23:11:03
2 https://popozure.info/pz-hatenablogcard fb 6 2015/09/25 12:08:46
3 https://popozure.info/pz-linkcard tw 3 2015/09/27 14:28:12

取りたいカウントが増えてもテーブル構造が変わらないタイプ。

同じURLだったら連想配列にして戻せれば、自由度上がりそう?

 

さきほどの「SNS Count Cache」では、wp_options に期限付きで保存できる 「Transients API」を使用しているとのこと。

こんなのもあるんだー?Σ(゚ロ゚)o゙

 

とりあえず、もう一個テーブル作ったりするのも面倒だし、Pz-Lkcのキャッシュ用テーブルに項目を追加することにしました。

自サイト内の記事はキャッシュしていないので、このままだと自サイトの記事だけソーシャルカウントがキャッシュされません。

 

というわけで、自サイト内の記事もキャッシュするように修正しました。

ちなみに、自サイト内記事の場合、WordPressから記事を取得するよりも、このプラグインのDBキャッシュから読みだす方が高速でしたが、常に最新のタイトルと抜粋文を取得して表示します。

 

自サイト記事のキャッシュは無駄なようですが、管理画面を見ると投稿時の(もしかしたら恥ずかしい)タイトルが見られる利点もあるということで、このままに。

内部リンクのとき、DB処理を通らないつくりだったので、外部リンクだろうが内部リンクだろうが必ずDBキャッシュを探すように修正しました。

キャッシュ取得からカード表示までの流れ

URLと、自サイトのURLを見比べて、内部リンクか外部リンクかを判定します。

そして、URLをキーにしてキャッシュを取得します。

 

内部リンクの場合、キャッシュがヒットしていたとしても、WordPressへ記事情報を要求します。(ただし、このとき、更新フラグは立てません)

サイトアイコンとサムネイルが直接取得だった場合、取得しておきます。

 

外部リンクの場合、キャッシュがヒットしていなければ、リンク先を wp_remote_get で取得します。

ステータスが200番台~300番台で無い場合はエラーを見なして、更新フラグを立てません。

エラーでも、「404 Not Found」などは取得できていると思うので、タイトルや抜粋文としてセットします。

正常に取得が出来ていたら、自前でOGPとかmetaタグとかからタイトルと抜粋文を取得します。正常に取得できた場合だけ更新フラグを立てます。

OGP画像も取得できますが、保存して表示する仕組みが無いのでスルーします。(表示のたびに、リンク先サイトにあるでっかいOGP用の画像ファイルを読み込むことになる)

 

外部サイト、内部サイトとわず、共通処理に入ります。

サイトアイコンと、サムネイル画像の取得です。「WebAPIを使用」になっていた場合、APIを叩いて画像を取得します。

そして、ソーシャルカウントの取得。前回取得してから、特定の時間が経っていたら再取得します。

今までは取得→表示という仕組みでしたが、取得と表示のフェーズを分けて、キャッシュが無かったら取得、一通り取得が終わったら表示するようになっています。

なお、ソーシャルカウントのAPIを叩いたときのタイムオーバーは5秒。

取得できなかった場合は「-1」が入り、取得できなかったソーシャルカウントだけ次回取得します。

同ページにカードが複数あった場合、2枚目以降で取得できるケースもあるかと思います。

(この場合、ページを再表示すれば、1枚目も表示される)

カウントの更新がされた場合には、カウント更新フラグが立ちます。

 

タイトルを200文字、抜粋文を500文字に納めます。また、HTMLタグ等は除去します。

(HTMLタグの除去をしていなかったので、当サイトに乗っけたとき、カード内に画像やらリンクが表示されていたことがありました(^-^;)

 

更新フラグが立っている場合、タイトル、抜粋文のほか、ソーシャルカウントが保存されます。

(登録されていなかったら新規登録、最初にヒットしてキャッシュから呼び出しているときだったら上書きです。)

更新フラグが立っていないものの、カウント更新フラグが立っている場合には、カウント項目だけ更新します。

 

処理系がサブルーチンに分かれていないので、けっこう直すことに…。

慣れていないのにクラス化してつくっちゃって、返ってどうファイルとか訳ていいのか分からず…。

処理のかたまりをどばっと上に持ってったり、下に持ってったりしたので、エンバグしてしまうかと思ったのですが、すんなり動きました(^-^;

よかった、よかった。

では、いざ、試してみよう!(^-^)o

では、実際の表示速度は、というと…。

 

「え?Σ(゚ロ゚)o゙」

 

…Σ(゚ロ゚;o゙

 

「え?Σ(゚ロ゚)o゙」

 

…Σ(゚ロ゚)o゙

 

「超はええええええ!!!Σ(゚ロ゚)o゙」

 

誤解の無いように言いますと、「うわっ…私のプラグイン…速すぎっ!!」と自慢したいワケではありません(^-^;

ちゃんとソーシャルカウントが表示されているのに、普通の速度で表示されました。

どれだけソーシャルカウントの取得に時間がかかっていたのか、という話ですね(^-^;

 

あまりに普通の速度すぎて、「実はソーシャルカウント、ちゃんと取れてなくて、でたらめな数字が出てるんじゃなかろうか!Σ(゚ロ゚)o゙」とうたがって、実際にリンク先開いて、ソーシャルカウント見比べたりしてしまいました。

こんな感じ

下記の記事はソーシャルカウントが付いてるリンクがいっぱいありますが、普通に表示されていると思います。

↓たとえば、こちらのページ。

外部リンク、内部リンクが両方あっても、普通に表示されていると思います。

↓たとえば、こちらのページ。

 

ソーシャルカウントの更新のタイミングですが、「特定の時間が経っていたら更新される」と上の方に書きました。

とりあえず、カードが初めて表示されてから「2時間+最大1時間のランダム」経過したら、カウントを取り直します。

2回目からは、「12時間+最大6時間のランダム」経過したらカウントを取り直すようにしてみました。

 

同じ記事にブログカードを10枚貼っていたとして、初めて表示されてからちょうど2時間後に更新が来ると、10枚全部更新がきてしまいます。

取得のタイミングをばらけさせるために、ランダムの時間を設けてあります。

 

更新のタイミング「○○○○○秒」+「ランダム○○○○秒~○○○○秒」みたいな設定項目を作るといいのかな(^-^;

基本更新時間を30分か1時間単位で指定させて、暗黙でランダムで30分付ける方が分かり易いでしょうか。

 

理想としては、wp-cronとかスケジュール登録して、記事を全部巡回して、Pz-LkCのショートコードがあるURLを全部取得してきて、数分ごととかに、何個かずつ裏で取得していってくれるのが理想なのですが…。

うん、無理!Σ(゚ロ゚)o゙

具体的にはぼくの勉強が足りません。

コメント

タイトルとURLをコピーしました