tosgos/phpipeable

一个用于以响应式方式建模数据流的 PHP 框架,类似于 Node streams

1.5.4 2018-08-21 23:41 UTC

This package is auto-updated.

Last update: 2024-09-20 04:52:39 UTC


README

提供轻量级的基于推送的流处理框架。

$someDataSource = new SomethingThatImplementsPipeable();
$someDataSink = new SomethingThatImplementsSink();
$someDataSource->pipe($someDataSink);

// Our pipe system is now in place,
// so shove some data through:

$someDataSource->emitSomeStuff(); // Use imagination here
$results = $someDataSource->emitClose(); // Let everyone know that's all,
                                         // and collect feedback from sinks

关于 Sink 接口的哲学思考

参考

interface TOGoS_PHPipeable_Sink
{
	function open(array $fileInfo=array());
	function item($item, array $metadata=array());
	function close(array $info=array());
	// __invoke(...) should be like item(...)
}

另一种方法是给 sink 接口一个更简单的定义,比如 '一个一元函数'。打开和关闭事件将通过与数据项相同的机制传递给函数(这是 EIT 的日志框架定义的方式)。

这种方法的一个缺点是,你的数据项需要包裹在某种类型的对象中,以区分它们与流元数据,这给实现和使用 sink 的代码增加了复杂性。

更复杂的 sink 接口更适合我今天关心的用例,即导入和转换 CSV 文件。将 open(...)、item(...) 和 end(...) 调用分离出来,可以给出有关元数据含义和它们应该调用的顺序的指导,从而让实现类不必定义这些内容。

close(...) 标记了一个提交任何更改的点,并且是方便地从深层嵌套的 sink 获取信息到调用者的方法。