年が明けたと思ったら、もう1月も終わり。。。
今年もあっという間なのだろうなと思いつつお問い合わせ対応に追われる毎日でございます。
おひさしぶりです。塚原です。
先ほど追われているとは書きましたが、お問い合わせばかりではく合間に開発もガッツリおこなってます。この前、スマホにPush通知できたりするParseを使う機会がありましたのでそれについて書きます。
元々仕組みはあったのですが、一度に大量に送るとトラフィックが集中するためサーバに負荷がかかることや一部自動化されていないところがあったので、PHPでバッチ化し自動で少量ずつこまめに送るようにしました。
まず、やったのがデータはすでにParse側に登録済みのものが大量にあったので、こまめに送るためのグループ分けをしました。
PHPのcurl関数を使いParseのREST APIを利用します。
条件指定してデータの取得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
// ご自身でお使いのアカウントのキー $APPLICATION_ID = "Parse の APPLICATION ID"; $MASTER_KEY = "Parse の MASTER KEY"; // APIのURL $URL = 'https://api.parse.com/1/installations'; // 検索条件(json型式にした上でURLエンコードをかける) $GET_PARAMS = '?where=' . urlencode( json_encode( array( 'group' => array( '$exists' => false )))); // 並び順 $GET_PARAMS .= '&order=' . urlencode( 'createdAt' ); // 取得数 $GET_PARAMS .= '&limit=1000'; // curl初期化 $cl = curl_init(); // 出力結果のみ curl_setopt( $cl, CURLOPT_RETURNTRANSFER, true ); // GETで取得 curl_setopt( $cl, CURLOPT_CUSTOMREQUEST, 'GET' ); // ヘッダ情報の指定 curl_setopt( $cl, CURLOPT_HTTPHEADER, array( 'X-Parse-Application-Id: ' . $APPLICATION_ID, 'X-Parse-Master-Key: ' . $MASTER_KEY )); // URL+パラメータ curl_setopt( $cl, CURLOPT_URL, $URL . $GET_PARAMS ); // 実行 $result = curl_exec( $cl ); // 終了 curl_close( $cl ); // 結果 $res_arr = json_decode( $result ); |
whereはカラムと条件を指定して絞りこむことができます。
whereの group以下配列のキーは演算子で $exits は値があるかないかを指定するときに使います。他にも $lt は <、 $lte は <=、 $gt は >、 $gte は >=、 $ne は != などがあり、単純に groupの次を配列でなく値を指定することで = と同じ意味になります。
sortは並べ替えで、昇順はorder=カラム名、降順は -カラム名にすることで指定することができます。
limitは取得数を、ほかにもOFFSETと同じ働きをするskipを指定することができます。
上記では既存のデータに group というカラムを加えた上で、
groupが空のもの
1 |
'where=' . urlencode( json_encode( array( 'group' => array( '$exists' => false )))) |
登録日(createdAt)の古い方から
1 |
'order=' . urlencode( 'createdAt' ) |
1000件
1 |
'limit=1000' |
取得するということになります。
データが取得できたので group に値をいれて振り分けていきます。
データを更新する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// ご自身でお使いのアカウントのキー $APPLICATION_ID = "Parse の APPLICATION ID"; $REST_API_KEY = "Parse の $REST API KEY"; // APIのURL $URL = 'https://api.parse.com/1/installations'; // curl初期化 $ch = curl_init( $URL . '/' . "更新したいデータのobjectId" ); // 出力結果のみ curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); // 更新なのでPUT curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'PUT' ); // ヘッダ情報の指定 curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'X-Parse-Application-Id: ' . $APPLICATION_ID, 'X-Parse-REST-API-Key: ' . $REST_API_KEY, 'Content-Type: application/json' )); // データ $NO = '1'; curl_setopt( $ch, CURLOPT_POSTFIELDS, '{"group":' . $NO . '}' ); // 実行 $response = curl_exec( $ch ); // 終了 curl_close( $ch ); |
更新の場合は1データずつ行うので、先ほどとってきたデータをクルクル回すイメージになります。上記は group に対して番号を振っている形になり、jsonの中身を複数指定することで複数列を更新することができます。
※パラメータで渡しているjsonでもParse側のカラムの型によっては、ダブルクォートがついてるついてないで怒られますのでご注意を。
ここまでを1つのバッチとして作りました。一回のバッチ実行の中で繰り返しデータを取得しようとすると、途中から値が取得できなくなり、落ちてしまうことがあったので、ループせず、バッチ自体をこまめに呼び出すことで解決しました。
それではこの振り分けたグループ単位にPush通知を送りたいと思います。
条件を指定してPush通知する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
// ご自身でお使いのアカウントのキー $APPLICATION_ID = "Parse の APPLICATION ID"; $REST_API_KEY = "Parse の $REST API KEY"; // push用API $URL = 'https://api.parse.com/1/push'; // push内容 $msg = "メッセージ内容"; // 対象グループ番号 $NO = '1'; // curlの初期化 $cl = curl_init(); // 出力結果のみ curl_setopt( $cl, CURLOPT_RETURNTRANSFER, true ); // データをPOSTする curl_setopt( $cl, CURLOPT_CUSTOMREQUEST, 'POST' ); // ヘッダ情報の指定 curl_setopt( $cl, CURLOPT_HTTPHEADER, array( 'X-Parse-Application-Id: ' . $APPLICATION_ID, 'X-Parse-REST-API-Key: ' . $REST_API_KEY, 'Content-Type: application/json' )); // URL curl_setopt( $cl, CURLOPT_URL, $URL ); // データ curl_setopt( $cl, CURLOPT_POSTFIELDS, '{"where":{"group":' . $NO . '},"data":{"alert":"' . $msg . '"}}' ); // 実行 $response = curl_exec( $cl ); // 終了 curl_close( $cl ); // 結果 $res_arr = json_decode( $response ); |
pushのAPIは条件を指定して、その検索結果に対して一度の送ることができます。
where は取得の時と指定の仕方は同じで、alert には push の際に通知する内容を設定します。
※ここで返ってくるレスポンスはAPIの通信が成功したかによるもので、pushが成功したということではないです。push通知が出来ているかはParseの管理画面から確認できます。
ここまででもう1つバッチを作り、一定時間に1グループずつおくる仕組みにしました。他にもDBを使い、どのグループが送信済みかなどの管理はしていますが意図する動きは実現できました。値の渡す部分がjsonなので記述がややこしいですが、考え方はSQLに近いのでコツさえつかめば意外と便利です。
まだグループの送信頻度や1グループのボリュームなど、調整するところはありますが有効活用していきたいと思います。
それではまた~!
名の由来は「天祐」。 そのままではおこがましいので 天の字から1本棒をとればと叔父がつけてくれたもの。 名に恥じぬよう世の中の助けとなるものを創り出していきたいです。 for Facebookのサポート・運用開発の部隊に所属しています。