mehr-it / buffer
实现缓冲区工具的库
Requires
- php: >=7.0
Requires (Dev)
- phpunit/phpunit: ^7.4
This package is auto-updated.
Last update: 2024-09-10 16:47:18 UTC
README
这是一个小型库,用于实现简单的缓冲区工具,以处理大数据集。
刷新缓冲区
刷新缓冲区实现了具有指定大小的缓冲区,当缓冲区满时,将自动使用给定的处理函数刷新。
您可以通过以下方式创建实例。它最多接受三个参数
new FlushingBuffer(10, function(data) { /* send data */ });
new FlushingBuffer(10, function(data) { /* send data */ }, function() { return collect(); });
第一个参数指定缓冲区大小,第二个参数是每次缓冲区满时被调用的处理函数。它接收缓冲区数据作为参数。第三个参数是可选的,用作底层数据结构的解析器。如果省略,则使用简单的数组。
使用 add()
方法将新项添加到缓冲区。通常您希望在所有数据都添加后,即使缓冲区不满也最后一次刷新缓冲区。为此,只需调用 flush()
方法手动刷新缓冲区即可
$b = new FlushingBuffer(2, function(data) { /* send data */ });
$b->add(1);
$b->add(2);
$b->add(3);
$b->flush();
如果您想替换缓冲区给定键的元素,也可以指定一个键。
$b = new FlushingBuffer(2, function(data) { /* send data */ });
$b->add(1, 'key1');
$b->add(2, 'key1');
当然,替换现有元素不会增加缓冲区大小,因此不会导致缓冲区刷新。
添加多个项目
要一次性将多个项目添加到缓冲区,可以使用 addMultiple()
方法。默认情况下,键不会被保留。您可以通过将 true
作为第二个参数传递来更改此设置。
$b = new FlushingBuffer(2, function(data) { /* send data */ });
$b->addMultiple([1, 2, 3]);
// with preserved keys
$b->addMultiple(['a' => 1, 'b' => 2, 'c' => 3], true);
填充数组键
要使用相同值填充多个键,可以使用 fillKeys()
方法
$b = new FlushingBuffer(2, function(data) { /* send data */ });
$b->fillKeys(['a', 'b', 'c'], 1);
这将添加/替换键 "a"
、"b"
和 "c"
的值为 1
。
通过路径设置值
setPath()
方法设置给定数组路径的值。路径可以用点表示法指定为字符串,或作为数组
$b = new FlushingBuffer(2, function(data) { /* send data */ });
$b->setPath(['this', 'is', 'a' 'path'], 1);
$b->setPath('this.is.another.path'], 2);
这将根据需要创建新数组级别,但只有根级别项目会影响缓冲区计数。
块处理器
块处理器允许分块处理 iterable
并将处理后的项目作为生成器返回。它们与 PHP 的 array_chunk()
函数类似,但它们可以处理任何类型的 iterable
并返回一个生成器。因此,它们非常适合处理大数据集。
您可以使用它们如下所示
$in = function() { /* input generator code */ };
$generator = (new ChunkProcessor($in, 500, function($chunk) {
yield /* ... */
}))->consume();
要保留键,可以将 keepKeys
参数设置为 true
$generator = (new ChunkProcessor($in, 500, $processor, null, true))->consume();
作为静态方法存在,它创建处理器并一步调用 consume()
$generator = ChunkProcessor::process($in, 500, $processor);