Google Fusion Tablesでの作業-JSおよびPHP

概要:問題が発生しました-非常に限られたサーバーリソースで高負荷のWebアプリケーションを作成します。
GoogleはデータストアとしてFusion Tablesを選択しました。
記事に記載されている内容:Fusion Tablesの操作
a)Javascript-データのサンプリングのみ。
b)PHP(Zend Framework)-選択、追加、更新。
c)Googleのユーザーインターフェイス-テーブルとビューの作成。
記事にないもの:
a)負荷テスト。
b)アプリケーションの詳細な説明-PHP + JsプロジェクトでFusion Tablesを使用することに重点が置かれています。

Googleにはさまざまな製品があります。 -プラティティなし。
怠け者のWebプログラマーだけが彼のプロジェクトでGoogleマップを使用しませんでした。 プラグインするだけで、見た目が美しく、独自のサーバーをロードせず、ドキュメント化された便利な(少なくともv.2の) APIで 、少なくとも低速ではなく高速です-プラスもあります。 たぶんFTもいいだろうと思いました。 確かに、私はチェックしませんでした。 そして、これが結果です。


最近、私はよく知られたソーシャルネットワーク用のある種のアプリケーションを、ちょうど実験として書くというアイデアを思いつきました。 少し考えた後、選択肢は単純な掲示板に落ちました-不要なものを誰かに提供できる場所です。 ここではアプリケーションについて説明しません。モデレート中はリンクを提供しません。 残念ながら、私はフラッシュを使用して「with you」しているので、PHP + Jsの標準的な束で書きました。 このアプリケーションで珍しいのは、標準のmySQLの代わりに、GoogleのサービスであるFusion Tablesがストレージとして選択されたことです。 なんで? 非常にシンプル-収益化の保証はありません。 手元に無料のサーバー容量はありません-古い、不十分に構成された開発サーバーがあります。 私は初期段階で投資をしたくありませんでした-思い出させてください:プロジェクトはただの楽しみのために書かれました。 また、Google Maps APIに関する質問への回答を探しているときに、 Fusion Tablesに関する記事に出会いました。

アクセス権について少し。


テーブルからのリクエストデータは直接javascriptになります。 つまり (少なくとも読み取りのために)テーブルを公開する必要があります。 jsを難読化して、テーブルにハッキングしたい人がスクリプトからユーザー名とパスワードを取得できないようにする方法がわかりません。
したがって、すべての人にテーブルに書き込む権利を与えることは望みません。 したがって、データはサーバー側でのみテーブルに書き込まれます。 つまり ユーザーが広告を追加し、jsがユーザーが入力したデータをサーバーに転送し、phpスクリプトがそれらを取得してGoogle FTにログインし、データをテーブルに挿入します。

前の段落に対するすべての非難に事前に同意します! 繰り返しますが、jsでログイン/パスワードを非表示にする方法がわかりません。

それでは、行きましょう:

ステップ1-テーブルの作成


テーブルは、FTユーザーインターフェイスを介し作成されます 。 インターフェイスは直感的で、特別な知識は必要ありません。 主観的に-MS Accessを幾分連想させる。
そこで、テーブルに複数の行を挿入できます。 通常、mySQLを使用する場合、phpMyAdminを使用します
このビデオは、3つのフィールドを持つ単純なテーブルを作成する例を示しています。


はい、すぐに言います。FTでは、テーブル名は数字です。 たとえば、作成されたテーブルの場合は596524です。「データ」は単なるエイリアスであり、クエリでは使用できません。

すぐに実行します。単純なテーブルの場合、idフィールド(プライマリ自動インクリメントキー)を作成する必要はありません。各テーブルには「隠された」ROWIDフィールドがあります。 idの作成は、複数のテーブルにまたがってJOINを行う予定がある場合にのみ意味があります。 どうやってやるの? テーブルページのトップメニューには、[結合]ボタンがあります。 表示されるダイアログでは、ビュー(mySQLの観点からのビュー)のようなものを作成できます。

次に、テーブルを共有する必要があります。 承認なしでjsからデータを受信するため。 テーブルはすべて読み取り専用になります。 著者のみがデータを変更/追加できます。


テーブルの準備ができました。 ここにリンクがあります。

ステップ2-データの表示-JavaScript


私のほとんどのサーバーでは、htmlページとjsファイルが保存されています。 ページが読み込まれると、表示されるデータ(広告のリスト)がGoogleのサーバーから直接ダウンロードされます。

テーブルのデータは、視覚化モジュールを使用して表示されます。 ここから撮影。
これを行うには、ヘッダーindex.html-www.google.com/jsapiにjavascriptへのリンクを追加し、default.jsファイルに次の行を追加します。
google.load('visualization', '1'); 

Javascript での Google APIモジュールの読み込みの詳細については、 こちらをご覧ください

さらに、テーブルを照会し、関数(応答ハンドラー)を指定する必要があります。
 //  var queryText = 'SELECT id, name FROM 596524;'; //url  var reqUri = 'http://www.google.com/fusiontables/gvizdata?tq=' + encodeURIComponent(queryText); //  visualization var query = new google.visualization.Query(reqUri); //     -   query.send(displayData); 


UPD: dkukushkinが指摘したように、IEを使用している場合(9日まで)、サンプルにキリル文字が含まれている場合(おそらくだけではありません!)、ユーザーには「?」が表示されます。 文字の代わりに。 したがって、Google.vizualizationを削除し、独自にリクエストを行います。jQueryを賞賛してください。手で恐ろしいXMLHttpRequestを書く必要はありません。
  var queryText = 'SELECT id, name FROM 596524;'; $.ajax({ url:'http://tables.googlelabs.com/api/query?sql='+queryText+'&jsonCallback=?', type: 'GET', success:function(resp){ displayData(resp); }, dataType:'json' }); 

その後、バグはなくなり、すべてがすぐに美しくなりました。 私は長い戦いを計画していましたが、たとえばこのようなヘッダーを使って作業しましたが、つまり今回は驚き、通常はキリル文字を表示しました。 受信したデータの形式は、Vizualizationを使用したときの形式とわずかに異なるため、displayData関数も変更する必要があります。 しかし、何も問題はありません。通常のJSONオブジェクトが返されます。このオブジェクトには、列と行の2つの配列を含むテーブルパラメーターがあります。すべてがシンプルで明確です。

前述のように、それらのIDはクエリのテーブル名として使用されます(ところで、興味深い事実を見ることができます-2月26日にID = 505 xxxのテーブルを作成し、今日作成されたデータテーブルはID 596 524を受け取りました-〜91 FTに1か月未満で000個のテーブルが追加されました)。

そして最後に、ページ出力機能
 function displayData(response) { //     response   //http://code.google.com/apis/visualization/documentation/reference.html#QueryResponse numRows = response.getDataTable().getNumberOfRows(); numCols = response.getDataTable().getNumberOfColumns(); //    fusiontabledata = "<b>"; for(i = 0; i < numCols; i++) { fusiontabledata += response.getDataTable().getColumnLabel(i) + ","; } fusiontabledata += "</b><br />"; for(i = 0; i < numRows; i++) { for(j = 0; j < numCols; j++) { fusiontabledata += response.getDataTable().getValue(i, j) + ", "; } fusiontabledata += "<br />"; } //   document.getElementById('echoer').innerHTML = fusiontabledata; } 


JsFiddleの例

今、軟膏のハエ。 FTはSQLクエリ言語を使用します。 詳細はこちら 。 しかし! この言語には、いくつかの予期しない制限があります- たとえば、SELECTコマンドの条件にOR演算子がありません (表示される、UPD2を参照)(演算子がないため、(a | b)=!(!A&!B)のようなものに置き換える方法すらありません) NOT)、このテーマで提案を作成しました)。 ただし、座標を操作するための組み込み関数があります。 FTは通常、Googleの地図をサポートすることを目的としています。

実際のプロジェクトでクエリのキャッシュ(ブラウザ、ビジュアライゼーション、またはFT自体でキャッシュされる場所を正確に理解できませんでした)を回避するには、クエリ条件に「AND名が234567に等しくない」のようなものを追加します。 。Math.getRandomInt() )。

もちろん、リクエストを送信してレスポンスを処理するには、独自のクラスを作成する必要があります。 よく見ると、複雑なことは何もありません。 SELECT-GET要求によって特別なアドレスに送信され、サーバーからの応答はJSON形式で受信されます。 私はちょうどそれをしました-私はここに投稿するのは恥ずかしいです、かなり粗雑なコードを得ました。 そして文字通り今日、私はtrurl123から素晴らしいトピックに出くわし、jsでMVCを学ぶ必要があり、おそらく開発を放棄する必要があることに気付きました。

ステップ3-データの追加-PHP + Zend Framework


私が仕事のこの部分を取り上げたとき、トラブルの兆候はありませんでした。 Zend Frameworkには、 Googleのサービスを操作するためのAPI全体が含まれています 。 しかし、すべてがそれほどバラ色になったわけではありません。 一般的に、私は自分でFTを操作するためのクラスを作成する必要があり、Zend_Gdata_Baseをベースとして、 Drupalの動作不能なソリューションを使用しました。

クラスファイルはここからダウンロードできます 。 残念ながら、このファイルはZend標準に準拠しておらず、3つのクラスが含まれていますが、文書化は不十分です。 しかし、それは機能します。

これを使用するには、ファイル自体とZend / Gdata / ClientLogin.phpを接続する必要があります。

例:
 // (       ) $client = Zend_Gdata_ClientLogin::getHttpClient('your_login_here@gmail.com', 'your_pass_here', 'fusiontables'); //   $base = new Zend_Gdata_Fusion($client); //   $sql = "SELECT ROWID FROM 596524 WHERE id = 1;"; $rowdata = $base->query($sql)->get_array(); print_r($rowdata); //  -  API      $newRowId = $base->insertRow('596524',array( 'id' => time(), 'name' => 'trird row', 'added' => date('n/j/y'), ) ); //  $base->updateRow( '596524', //ID  array('name' => 'new first row'), //   $rowdata[1][0] //ROWID      ); 


手が届くと、ファイルを思い出してZend Proposalにアップロードします。

もう1つのポイント:INSERT / UPDATEコマンドを実行する必要がない場合、たとえばここで説明するように、Zend_Baseを使用できます。 実際、仕様によれば、GETリクエストを介してSELECTのみを実行できます( http://code.google.com/intl/en/apis/fusiontables/docs/developers_guide.html#Updating "...行を更新するには、認証済みのPOSTを送信します要求...」

以上です。 石のコメントは大歓迎です。 ありがとう

PS:もちろん、ボールサービスで商業プロジェクトを続けることは意味がないことは理解していますが、アプリケーションが商業化された場合(つまり、十分なユーザーがいて、収益を得る方法を見つけた場合)、すぐに移行します独自のサーバー。 そして、現時点で私は:
-初期費用がわずかな、非常に美しく高速なアプリケーション。
-私はすべてが同じように速く、ストレス下でも機能すると信じています。

PPS:はい、コードハイライターがプレビュー時にのみバグがあることを願っています

参照:
Fusion Tables API- http://code.google.com/intl/en/apis/fusiontables/docs/developers_guide.html
Fusion TablesのSQL構文-http://code.google.com/intl/en/apis/fusiontables/docs/developers_reference.html
Fusion Tables UI- http://tables.googlelabs.com/
Zend Gdata- http: //framework.zend.com/manual/en/zend.gdata.html
FTを使用するためのPHPクラス-http://barahlo.semero.com/description/Zend_Gdata_Fusion.zip
UPD2:それはただの休日です! 今夜は提案更新し 、今ではORの類似物があります! 私はまだ自分でテストしていませんが、すべてがうまくいくことを願っています。

Source: https://habr.com/ru/post/J116035/


All Articles