gyselroth/stream-iterator

提供 \StreamIterator,允许遍历迭代器并将每个元素字符串化

v1.0.2 2019-12-03 13:26 UTC

This package is not auto-updated.

Last update: 2024-09-18 13:00:35 UTC


README

Build Status GitHub license Scrutinizer Code Quality Code Coverage GitHub release Latest Stable Version

\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