今回かな〜〜〜りハマりました。
このブログでもレビューを書いた記事には、対象書籍のAmazonリンクを貼っているのですが、普通のAmazonアフィリエイトのリンクはデザイン自体が古臭いのでなんだかなと思っていました。
そのためAmazonリンクをある程度デザインした状態のコードを出してくれるサービス「ヨメレバ」を利用していましたが、Wordpressの事なので誰かしらプラグインを作ってくれているだろうと検索すると案の定、結構人気でWordpressでAmazonアフィリエイトをやるなら定番的なプラグイン「AmazonJS」が見つかりました。
記事の目次
AmazonJSの導入要点のみ
AmazonJSの導入記事などでは、Wordpress管理画面のプラグインから検索してインストールの手順になっていますが、現在は検索に出てきません。
なのでWordpress公式のプラグインページからソースをダウンロード
Amazon JS — WordPress プラグイン
後は解凍したAmazonJSをpluginsディレクトリに保存してサーバにアップロードすればWordpress管理画面のプラグインに表示されますので、有効化して設定。
詳細な設定方法は省きますが、Amazonアフィリエイトのアカウントと、Amazon Product Advertising APIアカウントが必要になります。
AmazonJSプラグインがうまく機能しない
設定も完了したので、いざリンクを作ろうと商品検索を行ったのですが検索結果が下記のようにRank項目しか表示されていない!
ですがAmazonJSを使うのが初めてなので「よしよし動いた動いた」と思い商品を選択。
テンプレートはデフォルト設定が選択されているのにプレビューには何も表示されていない。
おかしいなと思い「少ない情報」や「画像(小)」、「画像(中)」に切り替えると、何とか画像のみ表示されました。
これはいよいよおかしいと他の方の記事のスクショなどを確認するとやはりプレビューにはしっかりと情報が表示されたリングが表示されています。
また商品検索結果の表示からすでに情報量が違います。
AmazonJSの説明には「WordPress 3.3 以上が必要」とあり、現在使っているWordpressのバージョンは4.8と余裕です。
さてはプラグインの開発が止まってて、最近のWordpressのバージョンでは互換性がなくて使えないのかと思い検索しても、それらしい記事は出てきません。
何個かAmazonJSが上手く動作しない時の対処法という記事は見つかりますが、内容は商品検索の国を「日本」か確認しろ的なもの。
デフォルトで日本になっているので話になりません。
一応これでもエンジニアなのでこうゆう場合はすぐにChromeのデベロッパーツールでJSの挙動を確認します。
すると下記のようなエラーが
Uncaught TypeError: Cannot read property 'replace' of undefined
replaceが定義されてない?
ナンノコッチャと引き続き調べます。
簡単に述べるとreplace対象のテキストが取得されていないのに、そのオブジェクトからreplace関数を使おうとすると出るエラーっぽい。
今度はAmazonJSのコードを解析し下記コードが怪しい。
selectedItem.Title.replace(/\[|\]/g, '');
結果AmazonJSの表示内容と上記コードがエラーになっていることから、商品画像以外のデータ(商品名、料金、その他)が取得されていないためエラーになり、プレビューには画像以外表示されないようだ。
取り敢えずAmazonJSの説明を熟読すると気になる記載がありました。
In first, AmazonJS converts tag from amazonjs short code in server side. Second, in window.load, amazonjs.js (it is added by plugin) will replace tag with formatted html to display Amazon Product by using jQuery template.
Google翻訳結果
最初に、AmazonJSタグはサーバ側でamazonjsショートコードから変換します。第二に、window.loadでamazonjs.jsは(それがプラグインによって追加された)jQueryのテンプレートを使って、アマゾンの製品を表示するには、HTMLタグでフォーマット置き換えます。
またAmazonJSの日本語説明記事には「WordPress 2.8以上、PHP5以上で動作します」とあります。
サーバ側で変換?PHP5以上??
AmazonJSがうまく機能しない原因と解決策
このブログは「KUSANAGI for さくらのVPS」上でHHVMを利用しWordpressを実行しています。
ですがAmazonJSの説明にもある通り、サーバ側(PHP)でAmazon情報を取得し変換しているため、HHVMでアプリケーションを実行しているとうまく取得・変換が行われないようです。
解決法としては下記コマンドでHHVMからPHP7に切り替えてあげると無事AmazonJSが利用できるようになりました。
[kusanagi@kusanagi71 ~]$ sudo kusanagi php7 php7 を使用します Removed symlink /etc/systemd/system/multi-user.target.wants/hhvm.service. Created symlink from /etc/systemd/system/multi-user.target.wants/php7-fpm.service to /usr/lib/systemd/system/php7-fpm.service. 完了しました。
KUSANAGIでHHVMとPHP7のパフォーマンス計測
この際なので簡単ですがHHVMとPHP7のパフォーマンスを計測したいと思います。
# PHP7に切り替え [kusanagi@kusanagi71 ~]$ sudo kusanagi php7 php7 を使用します Removed symlink /etc/systemd/system/multi-user.target.wants/hhvm.service. Created symlink from /etc/systemd/system/multi-user.target.wants/php7-fpm.service to /usr/lib/systemd/system/php7-fpm.service. 完了しました。 # KUSANAGIキャッシュOFF [kusanagi@kusanagi71 ~]$ sudo kusanagi bcache off offにします。 完了しました。
ローカルPCからApacheBenchで計測
# PHP7の状態 ab -n 1000 -c 100 https://tsukarooohi.com/ This is ApacheBench, Version 2.3 <$Revision: 1706008 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking tsukarooohi.com (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: nginx Server Hostname: tsukarooohi.com Server Port: 443 SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256 Document Path: / Document Length: 45558 bytes Concurrency Level: 100 Time taken for tests: 13.823 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 45832000 bytes HTML transferred: 45558000 bytes Requests per second: 72.34 [#/sec] (mean) Time per request: 1382.318 [ms] (mean) Time per request: 13.823 [ms] (mean, across all concurrent requests) Transfer rate: 3237.88 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 118 524 414.8 367 6042 Processing: 180 770 500.4 596 3688 Waiting: 62 308 228.3 226 1752 Total: 325 1294 743.9 1080 6997 Percentage of the requests served within a certain time (ms) 50% 1080 66% 1340 75% 1580 80% 1736 90% 2231 95% 2857 98% 3450 99% 3973 100% 6997 (longest request)
# HHVMの状態 ab -n 1000 -c 100 https://tsukarooohi.com/ This is ApacheBench, Version 2.3 <$Revision: 1706008 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking tsukarooohi.com (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: nginx Server Hostname: tsukarooohi.com Server Port: 443 SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256 Document Path: / Document Length: 45558 bytes Concurrency Level: 100 Time taken for tests: 13.937 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 45832000 bytes HTML transferred: 45558000 bytes Requests per second: 71.75 [#/sec] (mean) Time per request: 1393.729 [ms] (mean) Time per request: 13.937 [ms] (mean, across all concurrent requests) Transfer rate: 3211.37 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 62 495 439.5 347 6241 Processing: 97 789 583.6 614 5161 Waiting: 41 294 249.0 227 2593 Total: 223 1284 821.4 1024 7558 Percentage of the requests served within a certain time (ms) 50% 1024 66% 1326 75% 1587 80% 1737 90% 2337 95% 2956 98% 3599 99% 4131 100% 7558 (longest request)
PHP7結果
Time taken for tests: 13.823 seconds
Requests per second: 72.34 [#/sec] (mean)
HHVM結果
Time taken for tests: 13.937 seconds
Requests per second: 71.75 [#/sec] (mean)
本当に些細ですがPHP7の方がパフォーマンスはいいようです。
PHP7とHHVMのパフォーマンスに関してはもっと詳しく計測してる方がたくさんいますので、気になる方は調べてみてもいいかもです。
取り敢えず私はこのままPHP7での運用をしたいと思います。
KUSANAGIでHHVMとPHP7についてまとめ
記事ではすんなり解決まで至ったように書いていますが、実際は一週間以上ハマり、途中AmazonJSプラグインを削除したりと心折れる寸前でした(笑
今回WordpressプラグインのAmazonJSがうまく実行されないことからHHVMからPHP7に切り替えましたが、AmazonJSを利用する(記事挿入時)時だけPHP7にし、その後の運用はHHVMで行っても問題なく運用できると思います。
新しいサービスを使う時はメリットも多いですが未知のバグに遭遇する機会も増えるのでいい勉強にもなりますね。