• 締切済み

ajaxとphpでapiのデータ取得

上手にお伝えできるか不安ですが、以下の事象の原因で考えられるものがありましたら、アドバイスいただきたいです。 [処理内容] js(ajax)でphpをたたいて、GAのapiに接続、ページビューを取得して その取得内容もとにphpで静的ファイルを生成(jsonやhtml)して、任意の箇所で表示させています。 アクセスランキングのようなものになります。 ---------------------------------------------------- jsでphp呼び出し→phpでGAにアクセス→GA→phpで受け取る→jsonやhtml生成 ---------------------------------------------------- [気になる事象] GAからのデータの取得やjsonの生成は概ねうまくいっているのですが、時にデータが取得できない時があります。 何故かphpファイルを更新する(ソースに改行を加えただけ)と正しいデータが取得できたりします。 そんなことが動作に影響するのかわからないのですが、また1日後とかにデータを取得して表示させようとすると、 phpファイルを更新しない限り前回取得した状態から更新されなくなります。 キャッシュみたいなものが介在するのかわからないのですが、ajaxの部分の記述でcashはfalseとしています。 ちなみにGAの管理画面ではページビューが取れているので、apiとphpの間が怪しいといえば怪しそうな気もしています。 尚、静的ファイル(jsonやhtml)のタイプスタンプの更新は、js(ajax)にアクセスする度に正しく行われている為、 それらのファイルの生成そのものは問題ないと思われます。 拙い説明で恐縮ですが、 どうぞよろしくお願いいたします。

  • PHP
  • 回答数1
  • ありがとう数0

みんなの回答

  • pajama7
  • ベストアンサー率50% (3/6)
回答No.1

実際の挙動を見れないので、問題の切り分けを考えて、可能性を考えてみました。(ズバッと答えられなくてすいません…) まずGAのAPIから正しく情報が取れないということですが、正しく情報が取れないと言ってもいくつかパターンがあると思います。 HTTPにはスタータスコードがありますので、304が返ってくる(キャッシュの可能性)、200が返ってくる(正しく情報は取れているが内容が更新されていない)、500系エラー(リクエストに失敗した)などのパターンです。 ファイルのタイムスタンプはphpからファイルオープンなりをしたら更新される気がするので、GAのレスポンスがどうなっているかが、まず一つ目のキーになるかなと。 500の場合はリトライするなりすれば良いと思いますし、304が返ってくるなら回避する方法を探る、200の場合は同じレスポンスが返ってくるようなリクエストパラメータになっていないか(例えばずっとデータの絞り込みを表す日付パラメータdateとかがリクエストのたびに一緒だったりしないかとか)を見てみるといいかもしれません。 次に作成している静的ファイル自体が新しい情報に書き換わった状態で、ブラウザからみたときに情報が変わらないというケースです。 これはブラウザのキャッシュが影響してると思いますので、キャッシュの影響を受けないプライベートブラウジングなどのブラウザ機能を使って確認するとすぐ分かります。 その場合は、If-Modified-Sinceなどを調べてみると解決できるかなと思います。 すべて試したよという話であれば、お力になれずすいません。

Search_tmp
質問者

補足

アドバイスありがとうございます! 大変ありがたいです。 そして調査が緩くてすみません。 ステータスコードを表示してみたところ、200でした。 ちょっと思い込みがあったのですが、 GAのデータが取れているとお伝えしたのは、GAのリアルタイムの取得値の部分で、 私が取得しているデータは日付を指定して取得している形なので、「リアルタイム」とは異なるような気がしてきました。 実際にGAの側でリアルタイムではない当日の計測値を見るとまだ0のままでした。 GA側の当日のデータ(リアルタイムではないです)として表示されるところの数値が表示されるまでの時間は、 環境によってけっこうタイムラグがあるのでしょうか。(ご質問の趣旨がズレてすみません) 一応、復数の環境で試しているのですが、一方はけっこう早くて、もう一方は1日後とかです。 環境次第で比較的短時間で取れるケースもあれば、1日後みたいなケースもあったりするとすれば、この200という状態も致し方ない事かなと思いつつあります。 仮にそんなケースがあるのなら、当日のデータを表示するのはやめた方が良さそうな気がしています。

関連するQ&A

  • Ajax+JavaScriptにて外部データの取得について教えて下さい。

    お世話になります。 現在、JavaScriptとAjaxを勉強中なのですが、Ajaxを使ったデータ取得において、外部サーバデータ(例えばYahooホームページのソース)等を取得するには、PHPにて作成した簡易ブラウザが必要と記してありました。 つきましては、PHPでの簡易ブラウザのコードが記述されている書籍・サイトをご紹介頂けます様お願いします。 また、AjaxにてPrototype.jsなどを使っているのですが、具体的で実用的なAjaxの使い方をご教示頂けます様お願いします。 上記質問がカテ違いの場合はご指摘頂けます様お願いします。

    • ベストアンサー
    • AJAX
  • Ajax以外で、JavaScriptからPHPへ渡

    Ajax通信以外で、JavaScriptからPHPへ変数(配列)を渡したいのですが、 可能でしょうか? 下記のような状態の時、js変数dataを、Ajax通信を利用せずにPHP変数として取得したいのですが、どうすればよいでしょうか? JavaScript関数の中で、PHPフォームの送信ボタンをクリックさせる(ような)ことは出来ないのでしょうか? <button type="button" onclick="testsubmit();">送信</button> <script> function testsubmit(){  js処理;  var data = ★★; } </script> ■最終的にやりたいこと ・ボタンをクリックしたら、js処理で取得したjs変数(配列)を、Ajax通信を利用せずに、PHP変数として受け取りたい ・それを出来れば1クリックで処理したい

  • apiの値 取得

    初心者です。 ajaxで、apiから値を取得しています。 これをajaxを使用せず、javascriptだけで行おうとすると、リフレッシュ(更新)が必要になるのでしょうか? よろしくお願いします。 ・ネットで調べてajaxで値の取得はできようになりました。 ・ajaxは非同期だから、この質問は定義に矛盾でしょうか。 ・いろいろ分からなくてすみません。

  • ajaxにより取得したxmlデータの加工について

    ajax通信でRSSのxmlデータを取得し、一部のタグを抽出してhtml上にリンク一覧を作りたく、以下のような処理をテストで作りました。 $(function() { $.ajax({ url: '取得対象のxmlファイルパス', type: 'GET', success: function(data) { //var json = $.xml2json(data); $(data)find('title').each(function(){ console.log($(this).text()); }); } }); }); コンソールにはすべて空データしか確認できないのですが、取得したdataを変換等する必要がありますでしょうか。

  • C#をAPIで取得したいです

    こんにちは。 APIの取得プログラムを書くのは初めてです bootstrapを使っているAPIで スレッド型のサイトです スクロールさせると、新しい投稿が追加されるサイトで、 bootstrap-scrollspy.jsやbootstrap-dropdown.jsを使っているようです 1スレッドずつ取得したいのですが、初めの1ページだけしか取得できていません 環境は Windows 7 Pro i7 mem 24GB VS 2012 Express C# 現在はNewtonsoft.Jsonを使って試しています 回答よろしくお願いします

  • PHP4でのAjax データ出力形式について

    こんにちは PHP4.4.9でAjax通信時のデータ出力形式をどうしようか悩んでいます。 やりたい事は、HTMLのSELECTタグの中身を入れ替える事です。 普段は主にjsonでデータのやり取りをしていますが、PHP5.2以降という事でXMLにしようとしたのですが、今時じゃないのかなかなかサンプルが見つからず・・・ PEARやPECLでのライブラリ等の追加は都合上、行えません。 自前でXMLやJsonを作る事はしたくないので、よいサンプル等あればご教示ください。

    • ベストアンサー
    • PHP
  • jquery PHP 値 ajax

    失礼します。現在jqueryで作成した2次元配列をPHP側に渡したいのですが上手くいきません。 jquery側のコンソールで確認した際にはsuccessの処理が行われ配列の中身がjson形式で表示されるのですが、その内容をPHP側で確認しようとするとNULLが返ってきてしまいます。 何卒ご教授よろしくお願いいたします。 html側 $(function(){ // 送るデータ形式はJSONでなければ、PHP側でエラーが出る.のでJSON.stringify()でJSON形式に変換 send_data= JSON.stringify(data); // 送信処理 $.ajax({ url: "ajax.php", // 送信先のPHP type: "POST", // POSTで送る contentType: "Content-Type: application/json; charset=UTF-8", //必須ではなさそうだが、サーバ側との整合のために明示しておいた方がよい。 // dataType: 'json', //受信形式 必須ではなさそうだがサーバ側との整合のために明示しておいた方がよい。 data:send_data //JSON形式の送信データ }).success(function(data, status, xhr) { // 通信成功時の処理 console.log("success"); console.log("data ="+data); console.log("status ="+status); console.log("xhr ="+xhr); }).error(function(xhr, status, error) { // 通信失敗時の処理 console.log("error"); }).complete(function(xhr, status) { // 通信完了時の処理 console.log("fin"); }); }) }) PHP側 二通り試してみました。 <?php //php://inputはPOSTの生データを取得できる $json = file_get_contents("php://input"); //JSON形式データをPHPの配列型に変換 $data = json_decode($json); var_dump($data) ; //POSTできたデータを格納 $hoge = $_POST['data']; var_dump($hoge);

    • ベストアンサー
    • AJAX
  • cakePHP+Ajax アップロード状況の取得

    環境【cakePHP2.5, PHP5.5】 ファイルアップロードの進捗状況を取得してプログレスバーを表示したいのですが、うまくいかず困っております。 現状の方式は以下です(関連部分だけ抜粋) ●cakePHPのViewファイル(アップロードForm) <?php echo $this->Form->create('Model', array('type' => 'file')); ?> //Form作成 <?php echo $this->Form->hidden(ini_get('session.upload_progress.name'), array('value' => 'example')); ?> //PHPのアップロード状況取得設定 <?php echo $this->Form->file('upload_file'); ?> //ファイル選択 <?php echo $this->Form->submit('アップロード', array('div' => false, 'escape' => false));//submit ●Viewファイル内のjavascript(submitイベントを取得してajax通信) $(function() { $('#FormName').submit( function(event) { $.ajax({ url:'/controller/action', success:function (data, textStatus) { $('#progress').html(data); }, error:function (err) { console.log('ajax通信失敗:'+err); }, }); }); }); ●cakePHPのアクション ※アップロード処理は省略 public function action() { if ($this->request->is('ajax')) { //$_SESSIONキーから進捗状況を取得 $key = ini_get("session.upload_progress.prefix").'example'; $data = $_SESSION[$key]; //パーセンテージ計算 $progressData = round(($data["bytes_processed"]/$data["content_length"])*100); //結果表示用の変数に値を入れ、更新用のViewをrender $this->set(compact('progressData')); $this->render('/Elements/ajax/progress','ajax'); } } renderしているエレメントはアップロードViewファイルの中で指定しています。 大きく問題は2つあります。 1 ajax通信が動かない  cakePHPのアクションはキックしていますが(ログを吐かせて確認)、errorが返ってきます(errの中身は[ object Object ])。  ただし、submitイベント内ではなく、たとえば<input type=button>のonClickイベント関数の中に入れてやると正常に通信できます。  また、他にも数カ所ajax通信を行っている箇所がありますが、そちらは特に問題なく通信できています  なお、ajax通信部分をsetIntervalや関数に入れてSetTimeoutの中に含めると、アクションをキックすらできず何も動かない感じになります(なぜ…)  submitとajax通信は同時には出来ないものなのでしょうか? 2 ajax通信から$_SESSIONのupload_progress関連の値が取れない  ファイルアップロード中にcakePHPのアクションに普通にアクセス(GET)すると、アップロード状況が取得できるのですが、ajaxからこのアクションにアクセスすると値が取れない($_SESSION内にこのキーと値が存在しない)状態になります。  1の問題と絡んでいるような気もしますが、なぜajax通信のときだけ取得できないのか、原因が分からず困っております。 cakePHPでファイルアップロードの進捗を表示する機能をつくられている方など、なにかヒントを頂ければと思います。 なにとぞよろしくお願いします。

  • AjaxのOnFailureについて

    Ajax(prototype.js)を使用しているのですが、OnFailureが呼び出されてしまいます。 プログラムの流れです。 ボタン押下(html) ↓ 前処理(js) ↓ サーバのファイル情報取得(ajax非同期通信→php→戻ってきて情報取得) ↓ 取得したファイル数ループ(js) ↓ ↑ 別のサーバにコピー(ajax非同期通信→php→戻り値判定) ↓ ループ抜けたら終了処理 大量のファイルを処理した場合、4~5経過したあたりで 「別のサーバにコピー(ajax非同期通信→php→戻り値判定)」 が正常に行われず、後処理として記述してあるOnFailureを呼び出してしまいます。 OnFailureについて調べてみたのですが、MSDNのAjaxOptions クラスに 「ページの更新が失敗した場合に呼び出される JavaScript 関数。 この関数は、応答ステータス 200 の範囲内にない場合に呼び出されます。」 と記述されていました。 応答ステータスとは何を指しているのでしょうか。 回避方法があれば教えてください。 よろしくお願い致します。

  • ajaxの結果をphpで取得する方法

    お世話になっております。 PHPは全くの初心者ですが、jqueryのajaxでGETした内容を PHPでも使用したく、ご教示願いたいのですが、 以下のajaxの「info.a」の値をphpで使用するには どうすればよいでしょうか。 $.ajax({ type: 'GET', scriptCharset:'utf-8', url: '/hoge.jsp', dataType: 'text', cache : false, }) .success(function(data){ var data = data.split(','); info = { a :data[0], b :data[1], }; }) .error(function(XMLHttpRequest, textStatus, errorThrown) { return false; }); <?php $a = $_GET['info.a']; ?> 何卒よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう