ライター

ライター -- アーカイブの保存

導入

ライターは、データを扱うオブジェクトです。 データを変換する (アーカイブライターの場合) ライターもあれば、ディスクに保存する (ファイルライターの場合) ものやメモリに保存する (メモリライターの場合) もあります。これらはみな同じインターフェイスを実装しています。

リーダーからのデータをライターに移すには File_Archive::extract 関数を使用します。

すべてのライターは File_Archive ファクトリで作成されます。 より正確に言うと、File_Archive::to* 関数を使用します。

アーカイブの書き込み

アーカイブを生成するライターは、 toArchive() 関数で作成します。

toArchive (string $filename, &$innerWriter [, $type = null [, $stat = array() [, $autoClose = true]]])

ファイルへの書き込み

ライターは、ファイルの内容を物理ファイルに書き込むことができます。 そのようなライターを作成するには File_Archive::toFiles(); をコールします。ディレクトリが存在しない場合は自動的に作成します。

メールの送信

メールの添付ファイルとして送信するには、 File_Archive::toMail 関数でメールライターを作成します。

toMail (array $to, array $headers, string $message [, &$mail = null])

この関数は PEAR の Mail および Mail_Mime ライブラリを使用しており、 パラメータはこれらのクラスと同じです。

ユーザへのファイルの送信

ファイルをリモートユーザに送信する (つまり、データを標準出力に送る) には、特別なライターが必要です。これは、関数 File_Archive::toOutput() をコールして作成します。

このライターは、ファイルをダウンロードさせるようなヘッダを自動的に送信します。

ヘッダを送信させたくない場合は File_Archive::toOutput(false) とコールします。

マルチライター

マルチライターを使用すれば、 ふたつ以上の場所にデータを平行に書き出すことができます。

典型的な使用法は、ユーザ向けにデータを送信すると同時にファイルにも書き出すといったものです。

また、複数の形式のアーカイブを作成する際にも使用できます。

マルチライターを作成するには File_Archive::toMulti($dest1, $dest2) を使用します。

ライターへの書き込み

リーダーを使わずに、データを直接ライターに書き込むこともできます。 そのためには、各ライターが実装している以下のインターフェイスを使用します。

注意 newFile() 関数で情報の配列を指定しない場合は、 ファイルの終端に達するまでアーカイブの大半のデータをバッファリングする必要が生じます (通常は、ファイルのサイズがわからなければヘッダを書き込めないからです)。

巨大なファイルを扱う際には、これはメモリの問題を引き起こす可能性があります。

ライターを使用する関数

引数としてライターを受け取る File_Archive のすべての関数は、文字列および配列の両方の形式を受け付けます。 文字列は、File_Archive::appender() 関数を用いて自動的にライターとして解釈されます。 配列はマルチライターと解釈されます。

ライターは参照渡しとなるので、生の文字列や配列ではなく変数を渡す必要があります。

したがって、先ほどの例は次のように書き換えることもできます。