php_stream_make_seekable() は、まず origstream
が
シーク可能かどうか調べます。もしシークできない場合は、新たに一時的ストリーム
を作り、元のストリームのデータをすべてそこにコピーします。
成功の場合は、newstream
には、元のストリームが
シーク可能だったとしても、常に利用可能なストリームが返されます。
flags
で、どのような形のシーク可能なストリームが
返されるかを指定することができます。デフォルトのシーク可能なストリームを
利用したい場合は、PHP_STREAM_NO_PREFERENCE を
(通常では動的に増大するメモリ上のバッファを利用するが、
もしストリーム内のデータが巨大な場合は、テンポラリファイルに裏打ちされた
ストリームに切り替える)、または通常のテンポラリファイルに裏打ちされた
ストリームを利用したい場合は、PHP_STREAM_PREFER_STDIO
を指定してください。
表 44-1. php_stream_make_seekable() の返り値
Value | Meaning |
---|---|
PHP_STREAM_UNCHANGED | 元のストリームがシーク可能だった。newstream には origstream がセットされます。
|
PHP_STREAM_RELEASED | 元のストリームはシーク可能ではないので、開放された。
newstream には、新たに作成されたシーク可能なストリームがセットされます。
以後、origstream にアクセスしてはいけません。
|
PHP_STREAM_FAILED | ストリームの変換中にエラーが発生した。
newstream には NULL がセットされます。
このとき origstream はまだ有効なストリームです。
|
PHP_STREAM_CRITICAL | ストリームの変換中にエラーが発生し、元のストリームは origstream
不定な状態になっている。newstream には
NULL がセットされます。このときは、origstream
を閉じることを強く推奨します。
|
注意: 新しいストリームに対してシークを行い書き込みを行うような場合、 そのストリームは、必ずしも元のストリームと同じリソースに 関連付けられていると保証されているわけではないので、 この関数を呼び出す意味はあまりありません。
注意: もし、前方へのシークのみが必要なときは、この関数を利用してストリームを シーク可能にする必要はありません。ストリーム API は、 whence パラメータが SEEK_CUR の時、前方シークを エミュレートするからです。
注意: もし、
origstream
がネットワークベースのストリーム の場合は、この関数は、すべてのデータが読み込まれるまでブロックします。
注意: 絶対に、PHP スクリプト内で使用されているファイルポインタを参照する ストリームを、
origstream
に指定しないでください。 この関数は、そのストリームを閉じる場合があるので、スクリプト内で次に そのファイルポインタに対してアクセスが行われた場合に、クラッシュが 起こる可能性があります。
注意: ほとんどの場合において、この関数は、
origstream
が新たに開かれたストリームで、しかもストリーム層においてデータが バッファリングされていない時にのみ成功します。これにより、 また、この関数は正しく使うには多少複雑なので、できれば、 この関数を直接呼び出すのではなく、 php_stream_open_wrapper() を使い、 PHP_STREAM_MUST_SEEK をオプションとして渡す方法 を検討してみてください。