本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
中的串流AWS SDK for PHP第 3 版
作為其整合的一部分PSTREAMBody
參數S3PutObject 命令,可透過字串、PHP StreamPsr\Http\Message\StreamInterface
。
警告
軟體開發套件擁有任何原始 PHP 串流資源的所有權,而系統會將這類資源以輸入參數的形式提供給命令使用。此軟體開發套件會代您耗用並關閉該串流。
如果您需要在開發套件操作與程式碼之間共享串流,請先將該串流包裝在 GuzzleHttp\Psr7\Stream
執行個體中,隨後再將其納為命令參數。軟體開發套件會使用串流,因此程式碼需要考量串流的內部游標移動。Guzzle 串流會在 PHP 的廢棄項目收集器銷毀 fclose
時,立即在基礎串流資源上呼叫該程式碼,所以您不需要自行關閉串流。
串流裝飾項目
透過 Guzzle 提供的各種串流裝飾項目,您可以控制開發套件、Guzzle 與串流資源的互動方式,而這些串流資源會以輸入參數的形式提供給命令使用。您可以善用這些裝飾項目,修改處理常式在指定串流中進行讀取和尋找的方式。以下提供局部清單;GuzzleHttpPsr7 儲存庫
AppendStream
逐一讀取多個串流。
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
允許使用者在無法尋找的串流上,尋找先前的讀取位元組。舉例來說,重新導向會造成系統必須倒轉串流,若是因此而導致無法尋找的實體主體傳輸失敗,則此裝飾項目相當實用。系統會將讀取自遠端串流的資料暫存於 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
透過 PHP 的 zlib.inflate 篩選條件來解壓縮或壓縮 gzip 內容。
此串流裝飾項目會略過指定串流的前十個位元組,藉此移除 gzip 標頭,並將供選用的串流轉換成 PHP 串流資源,最後再附加 zlib.inflate 篩選。然後,系統會將該串流轉換回 Guzzle 串流資源,以便做為 Guzzle 串流使用。
LazyOpenStream
延遲讀取或編寫檔案,該檔案只有在串流上執行 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
用來讀取現有串流物件的子集或切片。此裝飾項目有助於將大型檔案拆分成較小物件,藉此以區塊形式進行傳送 (例如: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
包裝串流,且無法進行尋找。
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
提供唯讀串流,進而從 PHP 可呼叫功能中擷取資料。
調用提供的可調用時, PumpStream 將請求讀取的資料量傳遞至可呼叫功能。可呼叫功能可以選擇忽略此值,並傳回低於或高於請求的位元組。透過供選用可呼叫功能所傳回的任何額外資料,皆會暫存於內部,直到 PumpStream。如果沒有更多要讀取的資料,則供選用的可呼叫更能必須傳回 false。
實作串流裝飾項目
建立串流裝飾項目GuzzleHttp\StreamDecoratorTrait。此特徵所提供的方式,旨在透過基礎串流代理來實作 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!"