gyselroth / stream-iterator
提供 \StreamIterator,允许遍历迭代器并将每个元素字符串化
v1.0.2
2019-12-03 13:26 UTC
Requires
- php: >=5.6
- psr/http-message: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: *
- phpstan/phpstan: *
- phpunit/phpunit: ^5.0.0
This package is not auto-updated.
Last update: 2024-09-18 13:00:35 UTC
README
\StreamIterator\StreamIterator 提供了一个完全符合 PSR-7 的迭代器流包装器。您还可以传递一个回调函数来处理每个生成的迭代器条目。\StreamIterator 还适用于阻塞迭代器,并可用于创建实时流响应。
要求
- 最低支持的 PHP 版本是 5.6
- 该库依赖于以下外部 PHP 库
- psr/http-message (^1.0)
安装
该包可在 Packagist 上找到,并通过 composer 安装
composer require gyselroth/stream-iterator
文档
示例使用一个简单的 ArrayIterator,当然您可以使用任何类型的可遍历对象。
读取整个迭代器
$my_iterator = new \ArrayIterator([0,1,2,3,4,5]); $stream = new \StreamIterator\StreamIterator($my_iterator); $contents = $stream->getContents(); echo $contents; //Prints 012345
使用回调函数
使用回调函数使我们能够对每个生成的迭代器元素进行操作
$my_iterator = new \ArrayIterator([0,1,2,3,4,5]); $stream = new \StreamIterator\StreamIterator($my_iterator, function($item) { return '-'.$item; }) $contents = $stream->getContents(); echo $contents; //Prints -0-1-2-3-4-5
JSON 流示例
在此示例中,我们从示例迭代器创建 JSON 输出
$my_iterator = new \ArrayIterator([['foo' => 'bar'], ['foo' => 'bar']]); $stream = new \StreamIterator\StreamIterator($my_iterator, function($item) { if($this->tell() === 0) { $string = '['; } else { $string = ','; } $string .= json_encode($item); if($this->eof()) { $string .= ']'; } return $string; }) $contents = $stream->getContents(); echo $contents; //Prints [{"foo":"bar"},{"foo":"bar"}]
(JSON) 流无缓冲
这允许迭代器的实时 JSON 流。这也允许在 \Iterator::next() 阻塞直到有新条目生成的情况下操作阻塞迭代器。每个迭代器项目都会在到达时立即打印出来。
注意 一些 Web 服务器启用了输出缓冲或 gzip,这将无法与实时流一起使用。请确保所有缓冲区都已完全禁用(对于使用实时流的端点)。例如,如果您正在使用 Nginx 和 PHP-FPM,您可能需要发送一个头
header('X-Accel-Buffering', 'no')
来禁用 fastcgi nginx 缓冲。否则,nginx 将缓冲您的输出。
$my_iterator = new \ArrayIterator([['foo' => 'bar'], ['foo' => 'bar']]); $stream = new \StreamIterator\StreamIterator($my_iterator, function($item) { if($this->tell() === 0) { $string = '['; } else { $string = ','; } $string .= json_encode($item); if($this->eof()) { $string .= ']'; } echo $string; flush(); return ''; }) $contents = $stream->getContents(); //Prints [{"foo":"bar"},{"foo":"bar"}] echo $contents; //Prints "" (Empty string)
变更日志
变更日志可在 此处 获取。
贡献
我们很高兴您愿意为这个项目做出贡献。请遵循给出的 条款。
感谢
此项目使用 Matthew Weier O'Phinney 提供的想法 phly/psr7examples。