日別アーカイブ: 2012年6月25日

[PHP]googleanalytics.class.phpは10個しかメトリクスを指定できない

さて、Google Analytics APIのクラスライブラリとしてgoogleanalytics.class.phpがあります。

まとめてデータを取得できるところが非常に便利なのですが
データ取得時に下記のようなエラーメッセージが出ることがあります。

エラーメッセージ
「Error: Bad request – Requested 11 metrics; only 10 are allowed.」

なんと、取得するときにメトリクスは10個までしか受け付けてもらえません。
たくさんコンバージョン(目的)の設定をしている場合は注意が必要です。

エラーが起こる記述

require_once 'googleanalytics.class.php';
$ga_id = 'AAA';	//Google Analytics ID
$ga_pass = 'BBB';	//Google Analytics パスワード
$ga_profile_id = 'ga:XXXXXXXX';	//プロファイルID
$metrics = '';
$metrics .= 'ga:visitors,';
$metrics .= 'ga:exits,';
$metrics .= 'ga:goal1Completions,';
$metrics .= 'ga:goal2Completions,';
$metrics .= 'ga:goal3Completions,';
$metrics .= 'ga:goal4Completions,';
$metrics .= 'ga:goal5Completions,';
$metrics .= 'ga:goal6Completions,';
$metrics .= 'ga:goal7Completions,';
$metrics .= 'ga:goal8Completions,';
$metrics .= 'ga:goalCompletionsAll';
try{
$ga = new GoogleAnalytics($ga_id , $ga_pass);
$ga->setProfile($ga_profile_id);
$ga->setDateRange('2012-06-01' , '2012-06-30');
$report = $ga->getReport(
array(
'dimensions' => urlencode('ga:date'),
'metrics'    => urlencode($metrics),
'sort'       => 'ga:date'
)
);
print_r($report);
} catch (Exception $e) {
print 'Error: ' . $e->getMessage();
}

とは言え、必要なデータはやはり取らないといけません。
こうなったら2回getReportを投げて戻り値の配列をマージしてみます。

require_once 'googleanalytics.class.php';
$$ga_id = '<Google Analytics ID>';
$ga_pass = '<Google Analytics パスワード>';
$ga_profile_id = 'ga:XXXXXXXX';	//プロファイルID
$metrics = '';
$metrics .= 'ga:visitors,';
$metrics .= 'ga:exits,';
$metrics .= 'ga:goal1Completions,';
$metrics .= 'ga:goal2Completions,';
$metrics .= 'ga:goal3Completions,';
$metrics .= 'ga:goal4Completions,';
$metrics .= 'ga:goal5Completions,';
$metrics .= 'ga:goal6Completions,';
$metrics .= 'ga:goal7Completions,';
$metrics .= 'ga:goal8Completions,';
$metrics .= 'ga:goalCompletionsAll';
try{
$ga = new GoogleAnalytics($ga_id , $ga_pass);
$ga->setProfile($ga_profile_id);
$ga->setDateRange('2012-06-01' , '2012-06-30');
$metrics_arr = explode(',', $metrics);	//メトリクスを配列化
$step_total = ceil(count($metrics_arr) / 10);
for($step = 0; $step < $step_total; $step++){
//10個ずつmetricsを抽出
$report_metrics = implode(',', array_slice($metrics_arr, $step * 10, 10));
$report_wrk = $ga->getReport(
array(
'dimensions' => urlencode('ga:date'),
'metrics'    => urlencode($report_metrics),
'sort'       => 'ga:date'
)
);
//初回は代入のみ
if($step == 0){
$report = $report_wrk;
continue;
}
//2回目移行は配列をマージ
foreach ($report_wrk as $wrk_idx => $ga_ret) {
$report[$wrk_idx] = array_merge($report[$wrk_idx], $report_wrk[$wrk_idx]);
}
}
print_r($report);
} catch (Exception $e) {
print 'Error: ' . $e->getMessage();
}

なんだか、カッコ悪い感じもしますが、GoogleAnalyticsのオブジェクト化を
1回だけにしておくのがポイントです。
このオブジェクトを作成するだけで僕の環境では2~3秒かかってました;

※ご注意
掲載している内容についてはご自身の責任で参考にされてください。

[PHP]バッチ処理 後編[バッチファイル作成&設置]

さて、バッチ開発後編です。
まずは、ファイルの絶対パスを一応確認しましょう。
PHPファイルを作成し、batchディレクトリにアップロードします。
batch_test.php 新規作成

print(__FILE__).PHP_EOL;

次に、TeraTermとかでバッチを置くディレクトリに移動
cd batch
実行
php batch_test.php
実行結果
/var/www/vhosts/<ドメイン名>/batch/batch_test.php
これが今回製作したバッチファイルの絶対パスになります。
次にbatch_test.phpを書き換えます。
適当なテーブル(t_batch_test)を一個DBに作成し、
INSERTするようにします。
batch_test.php 書き換え

$host = '<ホスト名>';
$user = '';
$pass = '';
$dbname = '';
try {
$dbh = new PDO('mysql:host='.$host.';dbname='.$dbname, $user, $pass);
$sql = "insert into t_batch_test (test) values ('from batch')";
$stmt = $dbh->prepare($sql);
$flag = $stmt->execute();
if ($flag){
print('success').PHP_EOL;
}else{
print('failed').PHP_EOL;
}
$dbh = null;
} catch (PDOException $e) {
print($e->getMessage());
die('error!!!').PHP_EOL;
}

再度、アップロードしてファイルを上書きした後
コマンドから実行
実行
php batch_test.php
表示結果で「success」と出れば、PHPの記述は問題ありません。
次はcronの設定です。
cronについて僕はレンタルサーバの業者から提供されている
管理者パネルで設定しましたが、そういうツールがない場合は
viあたりのエディタでcron設定ファイルを編集できます。
詳細な設定方法についてはここでは割愛します。
設定時にコマンドを下記のように設定します
コマンド
php /var/www/vhosts/<ドメイン名>/batch/batch_test.php
cronで指定した時刻に追加がされていれば完了です。
実行方法は他にPHPのsystem関数を使う手もあります。

※ご注意
掲載している内容についてはご自身の責任で参考にされてください。

[PHP]バッチ処理 前編[設置ディレクトリの準備]

windowsのシステムでバッチ処理をする場合、batファイルや
VBなんかで作ったexeなどをタスクマネージャみたいな
スケジューラでキックするのは常套手段だと思う。
じゃあ、linuxでPHPやらが動いている環境がある場合
どういう方法があるのかということでチャレンジしてみた。
今回は手持ちのレンタルLinuxサーバでバッチ処理をする方法を考える。
言語はPHPで、このPHPを起動するのはcron(クーロン)を使う。
なぜPHPかというと、既にWEBアプリで既に作った部品を流用できるから。
特にDBまわりのモジュールをもう一回Javaとかで作る気にならなかった。。。
cronはwindowsで言うところのタスクマネージャみたいなもの。
サーバ側で提供されていたコントロールパネルから設定できた。
対応しているかはレンタルサーバの会社とサービス内容にもよる。
バッチの場所は僕のサーバの環境では特に用意されていなかったので
ルートの(httpdocsと同じ)階層に新しくディレクトリを作成して
パーミッションを700で設定した。
※httpのルートに置くとブラウザでアクセスされる危険性があるので、もちろんやらない。
○手順
・httpdocsと同じ階層にいるか確認
・バッチ用ディレクトリ作成
 mkdir <ディレクトリ名>
 mkdir batch
・パーミッション変更
 chmod <属性値> <ディレクトリ名>
 chmod 700 batch
・所有者とアクセス権を確認
 ls -l
 表示結果:
 drwx—— 2 root root 4096 Jun 25 14:11 batch
アップロードを考慮してユーザ名(左から一番最初のrootの位置)がftpのユーザと
違った場合はユーザ名を合わせる。
・所有者の変更
 chown <ユーザ名> batch
次回はバッチファイル作成と設置です。

※注意
掲載している内容についてはご自身の責任で参考にされてください。

[FFFTP]mkdirで作ったディレクトリにアクセスできない

FFFTPを使ってコンテンツをアップロードする際に
「no such file or directory」となる。
と、こんな問い合わせがあった。
こういった場合、権限の問題を考える必要がある。
要は、このディレクトリを誰が作ったか、どんな人にアクセスを許しているか
ということ。
よくあるのが、TeraTermみたいなターミナルエミュレーターでログイン後、
suコマンドからroot権限でディレクトリを作って、そこにFFFTPでアクセスする場合。
その時は、ディレクトリの所有者とFFFTPでつなぐユーザ名を合わせる必要がある。
○所有者とアクセス権を確認
ls -l
○所有者の変更
chown <ユーザ名> <ディレクトリ名>
とりあえず、解決。

※注意
ご自身の責任でご参考にされてください。
ところどころ端折っているので、コマンドの実行にはリファレンス等を確認してください。