2016-12-06

Slim フレームワークの REST(PDO) および RESTfm を使って CRUD のテストをしてみた

 先日の記事『Slim フレームワークの REST による FileMaker データベースへのアクセス』では、REST URI 経由で FileMaker DB アクセス実験を行うために Silm フレームワークを採用しました。
 この記事ではWeb クライアントからの GET 要求を受領してから、 FileMaker データベースに PDO 経由で SELECT クエリを発行してデータを戻すという、Slim REST 側の操作方法を簡単にご紹介しました。

 今回はこの Slim フレームワークの REST 機能のパフォーマンステストに加え、RESTfm でもテストを行ってみました。
 RESTfm は、Goya 社 MIT ライセンスで公開しているオープンソースの PHP コードであり、 FileMaker Server で公開されているデータベースに対する REST API 機能を簡単に実装できます。

 とても便利!と思ったのは、REST に不慣れなプログラマが「 あるテーブルのレコードにアクセスする方法を知りたい」と思ったときに、RESTfm 環境の index.html にアクセスするだけで、その URI を知ることができることです。 
 例えば、「EasyApp15‗p」データベースにログインすれば、任意のレイアウトのそれぞれのレコードへの URI が自動表示され(下図)、商品レイアウト上のレコード ID 10951 へのレコードにアクセスするためのリンクが表示されていることが確認できます。


 また、URL の最後の部分のファイル拡張子は .html ですが、これを .json、.xml、.txt、.fmpxml などに書き換えるだけで、自動的に変換表示してくれるのもよいですね。これは、PHP でプログラムしたことがある方ならわかりますが、結果セットを簡単に見ることができ、とても楽ちんです。


 さて、本題に戻りますが、今回のパフォーマンス検証では、クライアントの Web ページから GET(取得 READ)、POST(新規作成  CREATE)、PUT(更新 UPDATE)、DELETE(削除) 要求を発行しました。

 比較用として、記事「 FileMaker API別にCRUDのテストをしてみた」で採用した API も一緒にグラフに掲載しておりますので、 併せて参考にしてください。

テスト環境

サーバ: Xeon 2.2GHz(1Core)/4GB RAM(Hyper-V 仮想マシン)
OS/Webサーバ: Windows Server 2012/IIS 8.0
FileMaker Server: Ver 15
使用言語: PHP
使用DB: FMEasy在庫 IWP/WD R1.5 (パイロット版)
使用REST API:
 Slim フレームワーク(PDO を使用)
 RESTfm 4.0.8 (FileMaker API for PHP を使用)
テスト概要:
 Slim フレームワーク REST URI 経由、および RESTfm の URI 経由でCRUD(Create/Read/Update/Delete)を行う簡単な Webアプリを作成・実行。

備考:
  1. Slim フレームワークから FileMaker データベースへの接続オブジェクトは PDO(ODBC)です。
  2.  RESTfm はその仕様上、内部的には FileMaker API for PHP で FileMaker Server に接続します。

 Slim フレームワークは Composer を使ってインストールします。
 詳しくは以下のリンクをご覧ください。
 https://www.slimframework.com/docs/start/installation.html

 RESTfm の最新版は 4.0.8 です。(2016/12/06 現在)
 以下のリンクよりダウンロードできます。
 https://github.com/GoyaPtyLtd/RESTfm/releases

 各テストはそれぞれ5回実施して開始から終了までの時間をプログラム上で測定。各5回の平均値を基にデータを作成しました。

Slim フレームワークを使用し、100件のレコードを REST URI 経由で検索・表示した際のブラウザウインドウ(FireFox)

RESTfm を使用し、100件のレコードを REST URI 経由で検索・表示した際のブラウザウインドウ(FireFox)

GET メソッドによる Readテスト 1


テスト内容:
 94万レコードを持つテーブルから該当件数が N 件になるようにレコードを検索し、その中から100レコードのみを表示

結果: XML圧勝! Slim は遅いね

該当件数がN件になるようにレコードを検索し、その中から100件を表示

          No. of found                     recs
APIs
0 15000 30000 300000 600000 900000
FM API for PHP 0 0.22 0.34 1.76 3.28 4.74
XML 0 0.19 0.25 1.68 3.26 4.71
PDO 0 0.65 0.72 2.47 4.18 5.91
Slim REST PDO 0 0.46 0.63 3.86 7.3 10.69
RESTfm 0 0.88 0.91 2.32 3.91 5.4


補足:
 対象レコード件数が 1万件前後までは他の API とさほどパフォーマンスの差は感じられませんが、2万件あたりから差は開いていき、3万件を超過すると Slim REST PDO グラフ線(エンジ色)の傾斜は急激にきつくなっています。

 これに対し、RESTfm (黄色のグラフ線)は、該当件数が90万件でも、その中から 100件取り出す程度であれば、PDO よりもパフォーマンスは良いようです。


GET メソッドによる Readテスト 2


テスト内容:
 94万レコードを持つテーブルで 該当件数が3万件になるように検索し、N 件のレコードを表示

結果: FM API for PHP と XML が有利 Slim と RESTfm はやはり遅い

該当件数が3万件なるように検索し、その中から N件を表示

         No of fetched                    recs
APIs
0 100 500 1000 2500 5000 7500 10000
FM API for PHP 0 0.34 0.81 1.36 4.32 6.99 10.51  
XML 0 0.25 0.55 1.09 2.88 6.04 10.58 16.19
PDO 0 0.72 0.74 1.28 3.45 5.18 7.46 10.24
Slim REST PDO 0 0.64 1.6 2.75 6.15 12.32 18.22 23.72
RESTfm 0 0.97 4.31 7.97 19.25      


補足

 100 件程度のデータを取り出すなら、やはり FM API for PHP および XML がパフォーマンスに優位性がみられます。
 取得件数が 5000 件を増えると PDO が優位になってきます。

 全体的にみて、Slim も RESTfm も取り出すデータ件数が増えるにしたがい、極端にパフォーマンスが低下しているのがわかります。

 2500件取得時には、Slim(注:Slimは PDO を使用) は PDO(注:Slim不使用の生PDO) の約 1.8倍の応答時間となっており、RESTfm は PDO の約 5.6倍の応答時間となっています。
 1万件取得時には、Slim は PDO の約 2.3倍の応答時間、RESTfm (注:FM API for PHP を使用)にいたっては、5000 件以降はサーバタイムアウト(30秒)が発生し、計測不能となっています。


CREATE テスト


テスト内容:
 94万レコードを持つテーブルに対して 100件のレコードを PHP のループにより作成。その後、作成した100件のレコードを検索して表示。

備考:
  1. Slim フレームワークは、内部処理をある程度自由にプログラミングできるため、クライアント側から 100回 POST 要求を発行するパターンと、1 回の POST 要求で Slim フレームワーク側で 100 レコードをループ作成する方法で計測を行いました。
  2. RESTfm は、URI のパターンは定型化されていますが、1件レコード作成用の URI と複数のレコード作成を一回のリクエストで実現するバルク処理用の URI が用意されているため、それぞれで計測を行いました。

    1件レコード作成用 RESTfm  URI パターン
    /RESTfm/{datagase}/layout/{layout}

    バルク作成用 RESTfm  URI パターン
    /RESTfm/{database}/bulk/{layout}

    それぞれ、POST メソッドにて json 形式のデータを送信。

結果: PDOの圧勝!ただ、バルク処理なら Slim PDO もいい感じ


100レコード連続作成結果

補足
 クライアント側から 1 回リクエストを発行し、REST 側で 100 回レコード作成したほうが、クライアントから 100 回リクエストを発行し、そのたびに 1 回レコードを作るよりパフォーマンスがよくなるのは当然ですけどね…

DELETE テスト


テスト内容:
 94万レコードを持つテーブルを使用。FM API for PHP と XML では100レコードが対象となるように検索を実行。その後に PHP のループによりレコードを1件ずつ削除。PDO および Slim では DELETE table WHERE ~により、100件を一度に抽出して一括削除。
 RESTfm では、100レコードが対象となるように検索を実行後、バルク処理を使ってレコードを一括削除。

備考:
バルク作成用 RESTfm  URI パターン
/RESTfm/{database}/bulk/{layout}

DELETE メソッドにて json 形式の削除対象データを送信。


結果: PDO 圧勝だが、Slim も RESTfm もバルク処理ならパフォーマンスはよい

100レコード削除結果



UPDATE テスト


テスト内容:
 94万レコードを持つテーブルを使用。FM API for PHP と XML では100レコードが対象となるように検索を実行。その後に PHP のループによりレコードを1件ずつ更新。 PDO および Slim では UPDATE table SET ~ WHERE ~により、100件を一度に抽出して一括更新。 更新後、更新対象となったレコード100件を検索して表示。
 RESTfm では、100レコードが対象となるように検索を実行後、バルク処理を使ってレコードを一括更新。

備考:
バルク更新用 RESTfm  URI パターン
/RESTfm/{database}/bulk/{layout}

注:PUT メソッドにて json 形式の更新データを送信。


結果: PDO圧勝!Slimも奮闘。ただ、RESTfm は連続更新は苦手みたい


100レコード更新結果

結論:


 Web アクセスをする場合、間に何か挟めば余分なトラフィックが発生しますので、低速になるのはあたりまえです。というわけで、これは納得の結果です。

 すべてが自己完結するような Web アプリケーションを一から組めば、パフォーマンスに優れ、かつかゆいところに手が届くものができるかもしれませんが、それなりのコストと時間がかかってしまうことがネックとなります。

 多少パフォーマンスを犠牲にしてしまうことが許容される業務環境で、Web アプリケーションをなるべく短期間で開発する場合は、Slim のような REST フレームワークや、RESTfm のような既成 REST モジュールを採用することは選択肢としてありでしょう。

 しかしながら、どれを採用するにしても、覚えることが増えることには変わりません。

 Slim フレームワークの場合は、GET/POST/PUT/DELETE などの送信メソッドに対応した便利な機能が多数用意されていますが、それらを組み合わせてそれぞれの要求に応答した処理を行うには、担当プログラマが検討してコーディングする必要があります。
 組み方によっては、効率的にデータベースアクセスができるものが仕上がるという柔軟性はあります。

 RESTfm に関しては、操作用の定型 URI があらかじめ提供されているため、開発者がやりたいことさえ把握していれば、比較的高速に Web アプリケーションを完成させられるでしょう。Slim フレームワークに比べれば、覚えることが少ないのは良いと思います。
 ただし、RESTfm は FileMaker API for PHP を経由しますので、FileMaker API for PHP のパフォーマンスに縛られます。さらに、RESTfm 内部でも処理を行いますので、その分の処理コストが上乗せされます。
 つまり、FileMaker API for PHP が不得手な処理を RESTfm 経由で連続してやらせたりすると、パフォーマンスは極端に低下してしまいます。


 Web プログラミングは、長い目で見れば開発コストよりも運用コストの方がものを言います。特に、多数のクライアントを抱える Web サイトや、短時間に何人ものユーザが集中的にアクセスするようなサイトですと、Web サーバのパフォーマンス問題は避けては通れない話です。

 それぞれの特徴やパフォーマンスをある程度比較検討したうえで、業務要件に適したツール選択を行うのが失敗しない Web 開発につながるでしょう。


参考リンク:
Slim フレームワーク (英語)
Slim フレームワーク ユーザガイド (英語)
RESTfm (Goya 社)(英語)
RESTfm オンラインマニュアル (英語)
RESTfmがオープンソースに (Not only FileMaker)


(亀)

2016-12-01

FileMaker API別にCRUDのテストをしてみた


 FileMaker をバックエンドに Webプログラミング(カスタムWeb、CWP とも呼ばれる)を行う場合、実行速度的に一番有利な API はどれか? と悩んだ方もおられるかと思います。
 今回、FileMaker  API for PHP、XML、PDO(ODBC) を使用し、それぞれが CRUD(Create/Read/Update/Delete)に要する時間を測定してみました。みなさんが Webプログラミングを行う際の参考になればなによりです。

テスト環境

サーバ: Xeon 2.2GHz(1Core)/4GB RAM(Hyper-V 仮想マシン)
OS/Webサーバ: Windows Server 2012/IIS 8.0
FileMaker Server:  Ver 15
使用言語: PHP
使用DB: FMEasy在庫 IWP/WD R1.5 (パイロット版)
テスト概要:
CRUD(Create/Read/Update/Delete)を行う簡単な Webアプリを FileMaker API for PHP、XML、PDO(ODBC) 別に作成・実行。各テストはそれぞれ5回実施して開始から終了までの時間をプログラム上で測定。各5回の平均値を基にデータを作成しました。



FM API for PHP を使用し、100件のレコードを検索・表示した際のブラウザウインドウ(FireFox)

Readテスト 1


テスト内容
94万レコードを持つテーブルから該当件数が N 件になるように検索し、その中から100レコードのみを表示

結果: XML圧勝! PDO惨敗




          No. of found recs
APIs
0 15000 30000 300000 600000 900000
FM API for PHP 0 0.22 0.34 1.76 3.28 4.74
XML 0 0.19 0.25 1.68 3.26 4.71
PDO 0 0.65 0.72 2.47 4.18 5.91

補足

折れ線グラフではあまり目立ちませんが、該当件数が少ない場合、FM API for PHP または XML を使用したほうがPDOより3倍程高速であることが上表のオレンジ部分から解ります。表示する件数が100ほどの場合、検索時の該当件数(resultset)が増えるに従い、FM API for PHP / XML のPDOに対する優位性が薄れます。


Readテスト 2


テスト内容
94万レコードを持つテーブルで 該当件数が3万件になるように検索し、N 件のレコードを表示

結果: FM API for PHP と XML が有利



         No of fetched                    recs
APIs
0 100 500 1000 2500 5000 7500 10000
FM API for PHP 0 0.34 0.81 1.36 4.32 6.99 10.51 Error
XML 0 0.25 0.55 1.09 2.88 6.04 10.58 16.19
PDO 0 0.72 0.74 1.28 3.45 5.18 7.46 10.24

補足
100件の表示を行うのであれば、FM API for PHP と XML が有利ですが、表示件数が2500になると PDO の優位性が出てきます。ただ、画面上に2000件以上のレコードを表示する Webアプリ はあまりないと思われるので、FM API for PHP と XML に軍配を上げました。

注:
以前、郵便番号検索アプリを使用し、「北海道」を検索してレコードを表示するテストをAPI別に行いました。「北海道」を検索すると8000件強のレコードが検索されるので、このようなケースではPDOが優位となります。Webサーバの負荷を考えると、8000件一括表示は普通やらないほうが良いでしょう。

Create テスト 

テスト内容:
94万レコードを持つテーブルに対して 100件のレコードを PHP のループにより作成。その後、作成した100件のレコードを検索して表示。

注:
レコードを1件のみ作成するテストもやってみようかと思ったのですが、1件のみでは一瞬で処理が終了してしまい、他のプロセスが測定結果に大きく干渉すると思われたため、100件のレコードを作成することにしました。

結果:PDOの圧勝!

Delete テスト


テスト内容:94万レコードを持つテーブルを使用。FM API for PHP と XML では100レコードが対象となるように検索を実行。その後に PHP のループによりレコードを1件ずつ削除。PDO では DELETE table WHERE ~により、100件を一度に抽出して一括削除。


結果: PDO圧勝!

Update テスト


テスト内容:
94万レコードを持つテーブルを使用。FM API for PHP と XML では100レコードが対象となるように検索を実行。その後に PHP のループによりレコードを1件ずつ更新。 PDO では UPDATE table SET ~ WHERE ~により、100件を一度に抽出して一括更新。 更新後、更新対象となったレコード100件を検索して表示。

結果: PDO圧勝!


まとめ

 上記のテストより、Read(検索/表示)では FM API for PHP/XML が有利であることがわかりました。 Create/Update/Delete では PDO(ODBC) が有利でした。
API使用のガイドラインは以下のようになると思われます。
  1. 基本は、FM API for PHP を使用する
    XML は FM API for PHP より高速ですが、結果セット(resultset)の処理が面倒。
  2. 2000件を超えるレコードを表示したり、数十以上のレコードを頻繁に Create/Update/Delete するアプリでは、PDO(ODBC)を使用する 
 また、FM API for PHP/XML のクエリ機能は貧弱なので、SQL を使用しないと実現が面倒な DISTICT や UNION 等の処理については、PDO(ODBC)の使用を検討すべきでしょう。逆に、FileMaker ODBC で内外結合(JOIN)を行い結合先のテーブルに対してクエリを行うと恐ろしく速度が劣化します。JOINを使うのであれば、FM API for PHP により 関連テーブル(TO)にアクセスしましょう。 

 今回のテストを通じて感じたのは、「実行速度に問題が生じた場合は、1つのAPIに固執せず、別のAPIに当たってみるのが正解」ということでした。


(土屋)