1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 20843 -->
4 <sect1 id="zend.service.nirvanix">
5 <title>Zend_Service_Nirvanix</title>
7 <sect2 id="zend.service.nirvanix.introduction">
11 Nirvanix は Internet Media File System (<acronym>IMFS</acronym>)
12 です。インターネット上のストレージサービスに対して
13 ファイルをアップロードして保存し、ファイルを管理します。
14 また、標準的なウェブサービスインターフェイスでファイルにアクセスできます。
15 <acronym>IMFS</acronym> はクラスタ形式のファイルシステムで、インターネット越しにアクセスします。
16 また、メディアファイル (音声や動画など) に最適化されています。
17 <acronym>IMFS</acronym> の目標は、ますます増えていくメディアストレージに対応する
19 そしていつでもどこでもそこにアクセスできることを保証することです。
20 最後に、<acronym>IMFS</acronym> を使用すればアプリケーションからデータに対して
21 セキュアにアクセスできるようになります。また、
22 物理的なストレージを確保したり保守したりするためのコストも回避できます。
26 <sect2 id="zend.service.nirvanix.registering">
27 <title>Nirvanix への登録</title>
30 <classname>Zend_Service_Nirvanix</classname> を使う前に、
31 まずアカウントを取得する必要があります。詳細な情報は、
33 <ulink url="http://www.nirvanix.com/gettingStarted.aspx">Getting Started</ulink>
38 登録を済ませると、ユーザ名とパスワードそしてアプリケーションキーが得られます。
39 <classname>Zend_Service_Nirvanix</classname> を使うには、
44 <sect2 id="zend.service.nirvanix.apiDocumentation">
45 <title>API ドキュメント</title>
48 Nirvanix <acronym>IMFS</acronym> へのアクセス方法には、<acronym>SOAP</acronym> を使用する方法と
49 (より高速な) REST サービスを使用する方法があります。
50 <classname>Zend_Service_Nirvanix</classname>
51 は、REST サービスに対する比較的軽量な <acronym>PHP</acronym> 5 ラッパーを提供します。
55 <classname>Zend_Service_Nirvanix</classname> の狙いは
56 Nirvanix REST サービスをより簡単に使用できるようにすることですが、
57 Nirvanix サービス自体についてきちんと理解しておくことも大切です。
61 <ulink url="http://developer.nirvanix.com/sitefiles/1000/API.html">Nirvanix <acronym>API</acronym> Documentation</ulink>
62 に、このサービスについての概要から詳細な情報までがまとめられています。
64 <classname>Zend_Service_Nirvanix</classname>
69 <sect2 id="zend.service.nirvanix.features">
73 Nirvanix の REST サービスは、<acronym>PHP</acronym> の
74 <ulink url="http://www.php.net/simplexml">SimpleXML</ulink>
75 拡張モジュールと <classname>Zend_Http_Client</classname>
76 を使うだけでもうまく操作できます。しかしこの方法だと、
77 リクエスト時にセッショントークンを毎回渡したり、
78 レスポンスの内容を確認してエラーコードを調べたりといった繰り返し処理が面倒です。
82 <classname>Zend_Service_Nirvanix</classname> には次のような機能があります。
88 Nirvanix 名前空間内で使いまわします。
94 HTTP クライアントをそのまま使うよりもより便利なプロキシオブジェクトを用意し、
95 REST サービスへのアクセス時に毎回 HTTP POST
96 リクエストを手で作成させるような手間を省きます。
102 レスポンスオブジェクトのラッパーを用意し、
103 レスポンスをパースしてエラー時には例外をスローするようにします。
104 これにより、コマンドが成功したかどうかを調べるような
105 面倒くさい処理を軽減させることができます。
111 ありがちな操作を行うための、便利なメソッドを提供します。
118 <sect2 id="zend.service.nirvanix.storing-your-first">
119 <title>さぁはじめましょう</title>
123 <acronym>IMFS</acronym> 上にファイルを格納する準備は完了です。
124 <acronym>IMFS</acronym> 上で必要となる作業として最もよくあるものは、
125 新規ファイルの作成や既存ファイルのダウンロード、
126 そしてファイルの削除といったところでしょう。
127 <classname>Zend_Service_Nirvanix</classname>
128 には、これら 3 つの操作のための便利なメソッドが用意されています。
131 <programlisting language="php"><![CDATA[
132 $auth = array('username' => 'your-username',
133 'password' => 'your-password',
134 'appKey' => 'your-app-key');
136 $nirvanix = new Zend_Service_Nirvanix($auth);
137 $imfs = $nirvanix->getService('IMFS');
139 $imfs->putContents('/foo.txt', 'contents to store');
141 echo $imfs->getContents('/foo.txt');
143 $imfs->unlink('/foo.txt');
147 <classname>Zend_Service_Nirvanix</classname>
148 を利用する際の最初の手続きは常に、サービスに対する認証となります。
149 これは、認証情報を上のように <classname>Zend_Service_Nirvanix</classname>
151 連想配列の内容が、Nirvanix に対する POST パラメータとして直接渡されます。
156 <ulink url="http://developer.nirvanix.com/sitefiles/1000/API.html#_Toc175999879">名前空間</ulink>
157 で区別しています。個々の名前空間が、関連する操作群をカプセル化しています。
158 <classname>Zend_Service_Nirvanix</classname> のインスタンスを取得したら、
159 <methodname>getService()</methodname> メソッドをコールして
160 使いたい名前空間へのプロキシを作成します。
161 上の例では、<code>IMFS</code> 名前空間へのプロキシを作成しています。
165 使いたい名前空間へのプロキシを取得したら、そのメソッドをコールします。
166 プロキシ上では、REST <acronym>API</acronym> の任意のコマンドを使用できます。
167 また、プロキシにはウェブサービスのコマンドをラップする便利なメソッドも用意されています。
168 上の例では、<acronym>IMFS</acronym> の便利なメソッドを使用して新規ファイルを作成し、
169 それを取得して表示し、最後にファイルを削除しています。
173 <sect2 id="zend.service.nirvanix.understanding-proxy">
174 <title>プロキシについて</title>
177 先ほどの理恵では、<methodname>getService()</methodname> メソッドを使用して
178 <code>IMFS</code> 名前空間へのプロキシオブジェクトを取得しました。
179 このプロキシオブジェクトを使用すると、Nirvanix の REST
180 サービスを通常の <acronym>PHP</acronym> のメソッドコールと同じ方式で行うことができます。
181 自分で HTTP リクエストオブジェクトを作成する方式ではこのようにはいきません。
185 プロキシオブジェクトには、その他の便利なメソッドも用意されています。
186 <classname>Zend_Service_Nirvanix</classname> が用意するこれらのメソッドを使用すれば、
187 Nirvanix ウェブサービスをよりシンプルに使用できます。
189 <methodname>putContents()</methodname> や <methodname>getContents()</methodname>、
190 そして <methodname>unlink()</methodname> といったメソッドを使用していますが、
191 REST <acronym>API</acronym> にはこれらに直接対応するものは存在しません。
192 これらのメソッドは <classname>Zend_Service_Nirvanix</classname>
193 が提供しているもので、REST <acronym>API</acronym> 上でのより複雑な操作を抽象化したものです。
197 プロキシオブジェクトに対するその他のすべてのメソッドコールは、
198 プロキシによって動的に変換され、同等の REST <acronym>API</acronym>
199 に対する HTTP POST リクエストとなります。
200 これは、メソッド名を <acronym>API</acronym> のコマンドとして使用し、
201 最初の引数に渡した連想配列を POST パラメータとして使用します。
205 たとえば、REST <acronym>API</acronym> のメソッド
206 <ulink url="http://developer.nirvanix.com/sitefiles/1000/API.html#_Toc175999923">RenameFile</ulink>
207 をコールすることを考えてみましょう。このメソッドに対応する便利なメソッドは
208 <classname>Zend_Service_Nirvanix</classname> には用意されていません。
211 <programlisting language="php"><![CDATA[
212 $auth = array('username' => 'your-username',
213 'password' => 'your-password',
214 'appKey' => 'your-app-key');
216 $nirvanix = new Zend_Service_Nirvanix($auth);
217 $imfs = $nirvanix->getService('IMFS');
219 $result = $imfs->renameFile(array('filePath' => '/path/to/foo.txt',
220 'newFileName' => 'bar.txt'));
224 上の例では、<code>IMFS</code> 名前空間へのプロキシを作成します。
225 そして、プロキシ上で <methodname>renameFile()</methodname> メソッドをコールします。
226 このメソッドは <acronym>PHP</acronym> のコード上では定義されていないので、
227 <methodname>__call()</methodname> に渡されます。
228 そして、REST <acronym>API</acronym> に対する POST リクエストに変換され、
229 連想配列を POST パラメータとして使用します。
233 Nirvanix の <acronym>API</acronym> ドキュメントには、このメソッドには <code>sessionToken</code>
234 が必須であるとかかれていますが、プロキシオブジェクトにこれを渡していません。
235 これは、利便性を考慮して自動的に付加されるようになっています。
239 この操作の結果は <classname>Zend_Service_Nirvanix_Response</classname>
240 オブジェクトで返されます。これは Nirvanix が返す XML
241 をラップしたものです。エラーが発生した場合は
242 <classname>Zend_Service_Nirvanix_Exception</classname>
247 <sect2 id="zend.service.nirvanix.examining-results">
251 Nirvanix の REST <acronym>API</acronym> は、常に結果を XML で返します。
252 <classname>Zend_Service_Nirvanix</classname> は、この XML を
253 <code>SimpleXML</code> 拡張モジュールでパースして、
254 結果として得られた <code>SimpleXMLElement</code>
255 を <classname>Zend_Service_Nirvanix_Response</classname>
260 サービスから返された結果の内容を調べるいちばん簡単な方法は、
261 <acronym>PHP</acronym> の組み込み関数である <methodname>print_r()</methodname>
265 <programlisting language="php"><![CDATA[
267 $auth = array('username' => 'your-username',
268 'password' => 'your-password',
269 'appKey' => 'your-app-key');
271 $nirvanix = new Zend_Service_Nirvanix($auth);
272 $imfs = $nirvanix->getService('IMFS');
274 $result = $imfs->putContents('/foo.txt', 'fourteen bytes');
278 Zend_Service_Nirvanix_Response Object
280 [_sxml:protected] => SimpleXMLElement Object
284 [BytesUploaded] => 14
290 <code>SimpleXMLElement</code> の任意のプロパティやメソッドにアクセスできます。
291 上の例では、<code>$result->BytesUploaded</code> を使用して
292 取得したバイト数を調べています。<code>SimpleXMLElement</code>
293 に直接アクセスしたい場合は <code>$result->getSxml()</code> を使用します。
297 Nirvanix からの帰り値のほとんどは、成功を表すもの (<code>ResponseCode</code> がゼロ)
298 です。通常は <code>ResponseCode</code> をチェックする必要はありません。
300 <classname>Zend_Service_Nirvanix_Exception</classname> がスローされるからです。
301 エラー処理については次のセクションを参照ください。
305 <sect2 id="zend.service.nirvanix.handling-errors">
310 サービスからエラーが返されることも想定して
311 適切にエラー処理を行うようにすることが大切です。
315 REST サービスに対するすべて操作の結果は XML で返され、
316 その中には <code>ResponseCode</code> 要素が含まれています。
320 <programlisting language="xml"><![CDATA[
322 <ResponseCode>0</ResponseCode>
327 上の例のように <code>ResponseCode</code> がゼロの場合は、
328 その操作が成功したことを表します。操作が成功しなかった場合は
329 <code>ResponseCode</code> がゼロ以外の値となり、さらに
330 <code>ErrorMessage</code> 要素が含まれるようになります。
334 <code>ResponseCode</code> がゼロでないかどうかを
336 <classname>Zend_Service_Nirvanix</classname> は自動的に
337 Nirvanix が返す各レスポンスの内容をチェックします。
338 <code>ResponseCode</code> がエラーを表す値であった場合は
339 <classname>Zend_Service_Nirvanix_Exception</classname> がスローされます。
342 <programlisting language="xml"><![CDATA[
343 $auth = array('username' => 'your-username',
344 'password' => 'your-password',
345 'appKey' => 'your-app-key');
346 $nirvanix = new Zend_Service_Nirvanix($auth);
350 $imfs = $nirvanix->getService('IMFS');
351 $imfs->unlink('/a-nonexistant-path');
353 } catch (Zend_Service_Nirvanix_Exception $e) {
354 echo $e->getMessage() . "\n";
360 上の例で使用している <methodname>unlink()</methodname> は、REST <acronym>API</acronym> の
361 <code>DeleteFiles</code> コマンドをラップした便利なメソッドです。
362 <ulink url="http://developer.nirvanix.com/sitefiles/1000/API.html#_Toc175999918">DeleteFiles</ulink>
363 コマンドが要求する The <code>filePath</code> パラメータに、
364 存在しないパスを指定しています。その結果、
365 <classname>Zend_Service_Nirvanix</classname> からは例外がスローされます。
366 メッセージは "Invalid path"、そしてコードは 70005 となります。
370 <ulink url="http://developer.nirvanix.com/sitefiles/1000/API.html">Nirvanix
371 <acronym>API</acronym> ドキュメント</ulink> に、各コマンドに関連するエラーが説明されています。
372 必要に応じて、各コマンドを <code>try</code> ブロックでラップするようにしましょう。
373 あるいは複数のコマンドをひとつの <code>try</code> ブロックにまとめてもかまいません。