2012年4月20日金曜日

【php】ターミナルを使用してamazonからデータを収集・保存する

ブラウザでphpを開くのではなく、ターミナルからphpを実行し、amazonからデータを収集し、データベースに保存する。


環境
  • mac OSX lion
  • xampp mac os x版 1.7.3

php.iniの設定

amazonへのリクエストにServices_Amazonを用いる。そのため、php.iniのinclude_pathをあらかじめ修正しておく必要がある。

ブラウザでphpを開いた場合、参照するphp.iniは/Application/XAMPP/xamppfiles/etc/内のphp.iniである。しかし、ターミナルからphpを実行した場合、参照するphp.iniは/usr/etc/内のphp.iniになるらしい。

そこで、/usr/etc/php.iniに赤字部分を追加する。
;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;

; UNIX: "/path1:/path2"
;include_path = ".:/php/includes:/usr/lib/php/pear"
;
; Windows: "\path1;\path2"
;include_path = ".;c:\php\includes"
;
; PHP's default setting for include_path is ".;/path/to/php/pear"
; http://php.net/include-path
include_path = ".:/php/includes:/usr/lib/php/pear"

include_pathはphpファイルをinclude(あるいはrequire)する際に参照するフォルダである。/usr/lib/php/pearにServices_Amazonに関するファイルがあるため、これを追加することで'/Services/Amazon.php'を呼び出すことが可能になる。

参照:phpbook - インクルードパスの設定


データベースへの接続

上述の設定を行えば、amazonから情報を取得することができる。取得した情報をデータベースに保存する際に、注意する点がある。

$link = mysql_connect('localhost', 'ユーザ名', 'パスワード');

これだとなぜかエラーが出るので、これを下のように修正する。

$link = mysql_connect('127.0.0.1', 'ユーザ名', 'パスワード');

参照:stackoverflow


ソースコード
 

/*
* amazon apiにリクエストを送信し書籍ランキング情報を取得
* 取得した情報をデータベースに格納
* 
*/

// Services_Amazonの呼び出し
require_once 'Services/Amazon.php';

// amazon apiリクエスト時に必要なデータ
define('ACCESSKEY_ID', 'アクセスキーID');
define('SECRET_ACCESSKEY', 'シークレットアクセスキー');
define('ASSOCIATE_ID', 'アソシエイトID');
define('ECS_VERSION','2009-03-31');
define('RESPONSE_GROUP','Small,Images,ItemAttributes,OfferSummary,Reviews');

// main実行プログラム
$nodelist = array(
 "business" => "466282",
 "finance" => "492054"
);

foreach($nodelist as $key => $val){
 for($i=1; $i<=3; $i++){
  $ret = getItemRankingData($val, $i);
  saveItemRankingData($ret);
 }
}

function getItemRankingData($browse_node,$page){

 $amazon = new Services_Amazon(ACCESSKEY_ID,SECRET_ACCESSKEY,ASSOCIATE_ID);
 $amazon->setLocale('JP');
 $options = array();
 $options['BrowseNode'] = $browse_node;
 $options['Sort'] = 'salesrank';
 $options['ResponseGroup'] = RESPONSE_GROUP;
 $options['ItemPage'] = $page;

 $ret = $amazon->ItemSearch('Books',$options);
 return $ret;
}

function saveItemRankingData($ret){
 
  $link = mysql_connect('127.0.0.1', 'ユーザ名', 'パスワード');
  if (!$link) {
   die('miss!'.mysql_error());
  }
  
  $db_selected = mysql_select_db('test', $link);
  if (!$db_selected){
   die('データベース選択失敗です。'.mysql_error());
  }
  
  print('testデータベースを選択しました。');
  
  mysql_set_charset('utf8');
  
  for($i=0; $i<10;$i++){
   $title = $ret['Item'][$i]['ItemAttributes']['Title']."¥n";
   $sql = "INSERT INTO title (title) VALUES ('.$title.')";
   $result_flag = mysql_query($sql);
   
   if (!$result_flag) {
    die('INSERTクエリーが失敗しました。'.mysql_error());
   }
  }
  
  $close_flag = mysql_close($link);
  
  if ($close_flag){
   print('success end');
  }
}

?>



2012年4月15日日曜日

【php】mac os lion でphpを定期実行する

色々作っているうちに、phpファイルを定期的に実行したいと思うようになったので、試行錯誤した結果をメモ。


どうやって定期実行するのか?

「php 定期実行」と検索すると、cronというキーワードがよく引っかかる。mac os内にcronは標準で入っているのだが、cronはログオフやスリープ状態時には実行されないらしいので、mac os Xではcronではなくlaunchdを用いるのが推奨されている。そこで、今回はlaunchdを使った定期実行に挑戦する。

ちなみに、cronで定期実行する場合は、ターミナルで
$crontab -e
と入力するとvimエディタが起動するので、そこに「分 時 日 月 曜日 コマンド」を入力する。 例えば、
15 * * * * php test.php
だと、15分ごとにtest.phpが実行される。 入力後、保存を忘れないように。
 cronが設定されたかを確認するには、
$crontab -l

※ 私はこの方法で定期実行を実現することはできなかった。cron設定を入力し保存しても、なぜか保存されなかった。


launchdとは?

mac osで導入されている、デーモン実行プログラム(?)。 プログラムの定期実行だけでなく、「あるファイルが更新されたら」「ログインしたら」など様々な設定ができるらしい。


実装環境
  • Mac OS X Lion
  • Lingon 最新バージョン(たしか2.0.1?)

lanchdにおける定期実行の設定

launchdがどのように実行されているのか、実際どのようなファイルが書かれているのか、といった詳細については LaunchDaemons (launchctl, launchd.plist) の使い方 に書かれているので、こちらで勉強して頂きたい。 ここでは、とにかくlaunchdを用いて定期実行するだけの方法を説明します。
  1. phpファイルを用意
  2. lingonをダウンロード・インストール
  3. lingonを起動
    1. 左上のNewボタンをクリック
    2. Users Daemonsにチェックを入れCreate
    3. Name(たぶん適当で大丈夫)、What(「php test.php」など)、Whenを設定
    4. 左上のSaveをクリック
  4. OSを再起動

はまった点

 1. lingonを使用せずに、launchd.plist(/Library/LaunchDaemons/内に格納するファイル)を直接編集しようとしていたが、書き込み権限がないとか言って怒られ続けた。しかし、ファイルの権限を確認しても、ログインユーザは「読み/書き」になっていた。どう足掻いても無理だったので諦めた。

 2. lingonでphpファイルを設定する際、Whenを1分以内に設定してしまうと再起動時にうまくデスクトップが表示されなくなった。落ち着いて、画面上部をクリックすると各種アプリケーションを起動させることができたので、Finderから/Library/LanchDaemons/フォルダに移動し、Lingonで作成したファイルを削除することで解決した。