昨日の晩Skypeで「ランキングスクリプトに最新記事が反映されていないんだけど様子見て」と言われさっそく調査。
GAのPVを取ってくるためにpageviewsForPathを叩いていますが、この返ってくるJSONの内容がおかしい事がすぐ分かりました。
具体的にはこんな感じでarchiveTypeやentryなどの情報が全部undefで返ってきてる。
$VAR1 = {
'totalResults' => 886,
'items' => [
{
'entry' => undef,
'pageviews' => '311',
'author' => undef,
'category' => undef,
'archiveType' => undef,
'title' => "\x{30aa}\x{30fc}\x{30c8}\x{30b5}\x{30ed}\x{30f3}2014\x{3001}\x{4eca}\x{5e74}\x{3082}\x{5343}\x{8449}\x{770c}\x{8b66}\x{304c}\x{4e00}\x{6589}\x{53d6}\x{7de0}\x{3092}\x{5b9f}\x{65bd}\x{3010}\x{30ef}\x{30f3}\x{30c0}\x{30fc}\x{30c9}\x{30e9}\x{30a4}\x{30d3}\x{30f3}\x{30b0}\x{3011}",
'path' => '/archives/2014/01/2014-autosalon-police.html'
},
(後略)
本当ならここはentryにentry_idが、archiveTypeにIndividualが入っていないと駄目なはず。これが入っていないのでスクリプトでは個別アーカイブとして認識出来ず、当該のエントリーを抜かしていたという訳。これはDataAPIの挙動に問題がありそう。
pageviewsForPath Endpointは、個別ページだけでなく、インデックスやカテゴリーアーカイブが入るため実際にランキングで取る数より多く件数を取っています。これがいけないのかと思い多めにしていたlimitの数を30前後まで減らしてみました。そうするとデータが取れるようになった。
$VAR1 = {
'totalResults' => 887,
'items' => [
{
'entry' => {
'id' => '1430'
},
'pageviews' => '312',
'author' => undef,
'category' => undef,
'archiveType' => 'Individual',
'title' => "\x{30aa}\x{30fc}\x{30c8}\x{30b5}\x{30ed}\x{30f3}2014\x{3001}\x{4eca}\x{5e74}\x{3082}\x{5343}\x{8449}\x{770c}\x{8b66}\x{304c}\x{4e00}\x{6589}\x{53d6}\x{7de0}\x{3092}\x{5b9f}\x{65bd}\x{3010}\x{30ef}\x{30f3}\x{30c0}\x{30fc}\x{30c9}\x{30e9}\x{30a4}\x{30d3}\x{30f3}\x{30b0}\x{3011}",
'path' => '/archives/2014/01/2014-autosalon-police.html'
},
元々は200件取得して、30件の個別ページを一覧で出していたのですが、仕方が無いので30件取得して20件の個別ページを一覧で出すようにスクリプトを修正してとりあえずはクリアしました。
しかしこれだけじゃ、何のナレッジもたまらない。そこでさらっと仕組みを調査してみる事に。
pageviewsForPathが呼ばれると実際に叩かれるのは MT::DataAPI::Endpoint::Stats::pageviews_for_path()
この中でMT::DataAPI::Endpoint::Stats::fill_in_archive_info() を呼んでいます。
fill_in_archive_info() の中身を覗いてみるとそのものズバリ、ArchiveTypeなどをセットしている場所でした。この中でGA APIから返ってきている情報をarchive_infoとしてmt_fileinfoの中身と突き合わせをしています。
archiveTypeをセットしているのは、$fi->archiveTypeがdefinedの時。つまりこの場所を通っていてarchiveTypeが設定されていないという事はmt_fileinfoのデータの中にarchiveTypeが設定されていない物があるという事。
そこでデータベースを覗いてみると、archiveTypeがnullになっている行は一切なく、逆説的にarchiveTypeがundefになっているarchive_infoが出力されているという事は、mt_fileinfoのイテレータ $iterの中に当該のエントリーの情報が入っていない、MT->model('fileinfo')->load_iter()の条件式が誤っているという事になります。
内部処理で使われているURL一覧の行列 @in_pathが多くなりすぎてD::ODが処理しきれていないのか、別の問題か、、、
で、ここでタイムアップ。これ以上は僕の仕事ではないや:-P
以前もあったlimitを多くしすぎると尻切れとんぼのJSONが返ってくる問題や、今回の仕様と違った形のJSONが返ってくる所など、一人のユーザーとして調査しきれる内容のものではないので、一日もはやく修正される事をのぞんでおります。
p.s. ちなみにPerlデバッガーから直接MT::DataAPI::Endpoint::Stats::pageviews_for_path() を叩くのを試してみたところ、limitを200にしようが300にしようが正しい形のデータが取得出来ました。これってApache CGIとして動かした時に問題が発生するという事でしょうか。だとしたら、もっと根が深いなぁ、、、
Movable Type 6 本格活用ガイドブック (Web Designing BOOKS) | |
藤本 壱 柳谷 真志 奥脇 知宏 シックス・アパート株式会社 マイナビ 2013-11-30 売り上げランキング : 80852 Amazonで詳しく見る by G-Tools |