

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS SDK for PHP バージョン 3 でのストリーム
<a name="guide_streams"></a>

[PSR-7](http://www.php-fig.org/psr/psr-7/) HTTP メッセージ標準の統合の一環として、AWS SDK for PHP では [PSR-7 StreamInterface](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Psr.Http.Message.StreamInterface.html) を [PHP ストリーム](http://php.net/manual/en/intro.stream.php)の抽象化として内部的に使用しています。blob として定義されている入力フィールドを持つすべてのコマンド (`Body`S3::PutObject コマンド[の ](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putobject) パラメーターなど) では、文字列、PHP ストリームリソース、または `Psr\Http\Message\StreamInterface` のインスタンスを指定できます。

**警告**  
SDK は、コマンドへの入力パラメーターとして指定されたすべての RAW PHP ストリームリソースの所有権を持ちます。そのストリームはユーザーに代わって処理され、閉じられます。  
SDK のオペレーションとユーザーのコードの間でストリームを共有する必要がある場合は、そのストリームをコマンドパラメーターとして含める前に、ストリームを `GuzzleHttp\Psr7\Stream` のインスタンス内にラップします。ストリームは SDK で処理されるため、ユーザーのコードではストリームの内部カーソルの移動を把握する必要があります。Guzzle ストリームでは、ストリームが PHP のガベージコレクターによって破棄されるときに、基になるストリームリソースの `fclose` が呼び出されるため、ユーザーがストリームを閉じる必要はありません。

## ストリームデコレータ
<a name="stream-decorators"></a>

Guzzle には、いくつかのストリームデコレータが付属していて、それを使用すると、SDK と Guzzle が、コマンドへの入力パラメーターとして指定されたストリーミングリソースとどのようにやり取りするかを制御できます。これらのデコレータでは、指定されたストリームをハンドラーがどのように読み取りおよびシークできるかを変更できます。以下に部分的なリストを示していますが、完全なリストは [GuzzleHttpPsr7 repository](https://github.com/guzzle/psr7) にあります。

### AppendStream
<a name="appendstream"></a>

 [GuzzleHttp\$1Psr7\$1AppendStream](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-GuzzleHttp.Psr7.AppendStream.html) 

複数のストリームから順々に読み取ります。

```
use GuzzleHttp\Psr7;

$a = Psr7\stream_for('abc, ');
$b = Psr7\stream_for('123.');
$composed = new Psr7\AppendStream([$a, $b]);

$composed->addStream(Psr7\stream_for(' Above all listen to me'));

echo $composed(); // abc, 123. Above all listen to me.
```

### CachingStream
<a name="cachingstream"></a>

 [GuzzleHttp\$1Psr7\$1CachingStream](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-GuzzleHttp.Psr7.CachingStream.html) 

シーク不可のストリームで、以前に読み取ったバイトにシークできるようにするために使用されます。これは、ストリームの巻き戻しが必要であるために、シーク不可のエンティティ本文の転送が失敗する場合に便利です (たとえば、リダイレクトによるストリーム)。リモートストリームから読み取られるデータは PHP の一時ストリームにバッファされるため、以前に読み取られたバイトがメモリにキャッシュされ、その後にディスクに書き込まれます。

```
use GuzzleHttp\Psr7;

$original = Psr7\stream_for(fopen('http://www.google.com', 'r'));
$stream = new Psr7\CachingStream($original);

$stream->read(1024);
echo $stream->tell();
// 1024

$stream->seek(0);
echo $stream->tell();
// 0
```

### InflateStream
<a name="inflatestream"></a>

 [GuzzleHttp\$1Psr7\$1InflateStream](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-GuzzleHttp.Psr7.InflateStream.html) 

PHP の zlib.inflate フィルタを使用して、gzipped コンテンツを解凍または圧縮します。

このストリームデコレータは、指定されたストリームの最初の 10 バイトをスキップして gzip ヘッダーを除去し、ストリームを PHP ストリームリソースに変換してから、zlib.inflate フィルタを追加します。そのストリームは、Guzzle ストリームリソースに変換し直されて、Guzzle ストリームとして使用されます。

### LazyOpenStream
<a name="lazyopenstream"></a>

 [GuzzleHttp\$1Psr7\$1LazyOpenStream](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-GuzzleHttp.Psr7.LazyOpenStream.html) 

ストリームに対する I/O オペレーションが実行された後にのみ開かれるファイルに対する読み取りまたは書き込みを遅延します。

```
use GuzzleHttp\Psr7;

$stream = new Psr7\LazyOpenStream('/path/to/file', 'r');
// The file has not yet been opened...

echo $stream->read(10);
// The file is opened and read from only when needed.
```

### LimitStream
<a name="limitstream"></a>

 [GuzzleHttp\$1Psr7\$1LimitStream](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-GuzzleHttp.Psr7.LimitStream.html) 

既存のストリームオブジェクトのサブセットまたはスライスを読み取るために使用されます。これは、サイズが大きいファイルを小さく分割して、チャンクに分けて送信する場合に便利です (例: Amazon S3 マルチパートアップロード API)。

```
use GuzzleHttp\Psr7;

$original = Psr7\stream_for(fopen('/tmp/test.txt', 'r+'));
echo $original->getSize();
// >>> 1048576

// Limit the size of the body to 1024 bytes and start reading from byte 2048
$stream = new Psr7\LimitStream($original, 1024, 2048);
echo $stream->getSize();
// >>> 1024
echo $stream->tell();
// >>> 0
```

### NoSeekStream
<a name="noseekstream"></a>

 [GuzzleHttp\$1Psr7\$1NoSeekStream](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-GuzzleHttp.Psr7.NoSeekStream.html) 

ストリームをラップして、シークを許可しません。

```
use GuzzleHttp\Psr7;

$original = Psr7\stream_for('foo');
$noSeek = new Psr7\NoSeekStream($original);

echo $noSeek->read(3);
// foo
var_export($noSeek->isSeekable());
// false
$noSeek->seek(0);
var_export($noSeek->read(3));
// NULL
```

### PumpStream
<a name="pumpstream"></a>

 [GuzzleHttp\$1Psr7\$1PumpStream](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-GuzzleHttp.Psr7.PumpStream.html) 

PHP 呼び出し可能関数からデータを取り出す読み取り専用ストリームを提供します。

指定された呼び出し可能関数を呼び出されたときに、PumpStream は読み取りをリクエストされたデータ量を呼び出し可能関数に渡します。呼び出し可能関数は、その値を無視することも、リクエストされたバイト数と異なる量のデータを返すこともできます。呼び出し可能関数から返された余分なデータは、PumpStream の read() 関数を使用してドレインされるまで、内部的にバッファに入れられます。呼び出し可能関数は、読み取るデータがなくなった場合に false を返す必要があります。

### ストリームデコレータの実装
<a name="implementing-stream-decorators"></a>

[GuzzleHttp\$1Psr7\$1StreamDecoratorTrait](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-GuzzleHttp.Psr7.StreamDecoratorTrait.html) を使用すると、ストリームデコレータノードの作成は非常に簡単です。このトレイトでは、基になるストリームにプロキシすることによって `Psr\Http\Message\StreamInterface` を実装するメソッドが提供されています。`use` を `StreamDecoratorTrait` して、カスタムメソッドを実装するだけです。

たとえば、ストリームから最後のバイトが読み取られるたびに特定の関数を呼び出すことを考えてみます。そうするには、`read()` メソッドをオーバーライドことで実装できます。

```
use Psr\Http\Message\StreamInterface;
use GuzzleHttp\Psr7\StreamDecoratorTrait;

class EofCallbackStream implements StreamInterface
{
    use StreamDecoratorTrait;

    private $callback;

    public function __construct(StreamInterface $stream, callable $cb)
    {
        $this->stream = $stream;
        $this->callback = $cb;
    }

    public function read($length)
    {
        $result = $this->stream->read($length);

        // Invoke the callback when EOF is hit
        if ($this->eof()) {
            call_user_func($this->callback);
        }

        return $result;
    }
}
```

このデコレータを、任意の既存ストリームに追加して、このように使用できます。

```
use GuzzleHttp\Psr7;

$original = Psr7\stream_for('foo');

$eofStream = new EofCallbackStream($original, function () {
    echo 'EOF!';
});

$eofStream->read(2);
$eofStream->read(1);
// echoes "EOF!"
$eofStream->seek(0);
$eofStream->read(3);
// echoes "EOF!"
```