TitaniumとWordPressで(比較的)簡単SNSアプリ

titanium_wordpressTitanium Advent Calendar 2014の15日目。Titanium + WordPress + Node.jsの環境がうまくいっているので紹介。

書いてる途中で簡単か?と思い直し「比較的」付けた(笑

慣れると
WordPressで公開している → アプリ作りましょうか?
まずはアプリでサービス提供 → Web版も提供
が短期間で出来るようになる。

長くなったのでポイントだけ。

 

WordPressを使う理由

  • データベースの構造がシンプルで汎用性がある
  • 標準でユーザー管理、投稿、コメントなどの基本機能が揃ってる
  • テーマやプラグインで本体に手を加えずに開発出来るのもいい
  • アクション・フィルターの機能がNode.jsからキックするのに便利
  • 重い処理や非同期処理したい場合はWP-CRONの仕組みが便利
  • 情報が豊富
  • 初心者でもWordPressは触った人が多いので教えなくて済む。
    → アプリ側を上級者で開発して、Web側は他人に振れる。
  • PHPフレームワークと比べて遅いけど、最近は負荷分散する仕組みが豊富なので許容範囲になる。
    → アプリのリクエストはNode.jsで処理するのでWordPress(PHP)の遅さは関係なくなる

 

 

Titaniumを使う理由

  • 一つのコードでAndroid, iOS両対応出来るのが強い
  • ネイティブとまでいかなくてもサクサク動く
  • 最悪ネイティブモジュールを作れば何とかなる
  • Node.jsと組み合わせときの開発効率がうまい(全部JavaScript)

 

Node.jsを使う理由

  • アプリからは同時に大量のリクエストが来るのでPHPでは捌き切れない
    → データベースはMySQLではなくスレッドプールが使えるMariaDBにする
  • TitaniumもJavaScript。CommonJSの考え方を理解してTitanium側のコード品質も上がっていく。
    → Titaniumで作った汎用関数がそのままNode.jsで使える

 

ちなみにWordPressは外部にAPIを提供しているので、アプリから直接WordPressにリクエストを送るだけでも大抵のことが出来る。

Node.jsのモジュールの中にはWordPressのXML-RPC APIに接続するのもある。

私は最初アプリ向けのAPIはWordPressのプラグインで実装したけど、遅すぎて耐えられなかった。そのときの記事がこれ。

 

Node.jsから直接SQL実行するのが一番というのが私の結論。

Node.jsでアプリのAPIを実装するときのポイント。WordPressとどう連携するか。

  • ユーザーのログイン、新規登録だけNode.jsからPHPコマンドを実行(wp_insert_userとか)
  • データの取得、登録はNode.jsからSQL文を発行する。
    → そうしないと速度的に耐えられない。
    → カテゴリーの登録だけちょっと苦戦するぐらいで後は難しくない。
  • WordPressのアクションを実行する汎用的なPHPを書いてNode.jsからアクション名を引数にキックすると便利。
  • メール送信とかはWordPress側(プラグイン)で実装しておくと、ウェブ版を実装したときに楽。
    → Node.jsからはアクション名でキック
  • ファイルアップロードもNode.js側でファイルの配置とDBにInsertして、あとの画像加工はアクション名からWordPress側(プラグイン)で実行する
  • PHPシリアライズされたデータでもphpjs使えばエンコード、デコード出来る
  • WordPress側でオブジェクトキャッシュを有効にしていると、直接SQLでアップデートしたデータがウェブ版に反映されない。
    → キャッシュをクリアするアクションをAPIから発行する必要あり

 

WordPress公式アプリはソースコードが公開されているので参考になるかもしれない。

GPLなのでコードを流用する場合はソースコードを公開しないといけない。便利な機能はTitaniumのモジュール用に切り出して公開するとみんなが幸せになれるかも。

 

PhoneGap + WordPressで考えている人も後でPhoneGapの限界ともっさり感で泣くより、CommonJS覚えてTitaniumで開発するのをオススメしたい。

 

明日のTitanium Advent Calendarはk0sukeyさんです。

 

< Related Posts >