php实现pipeline
PHP 实现 Pipeline 模式
Pipeline(管道)模式是一种将任务分解为多个步骤的设计模式,每个步骤处理输入并传递给下一个步骤。在 PHP 中可以通过闭包、生成器或类实现。
使用闭包实现 Pipeline
通过闭包链式调用实现 Pipeline,每个闭包处理数据并传递给下一个闭包:

function pipeline(array $stages): callable
{
return function ($payload) use ($stages) {
return array_reduce(
$stages,
function ($carry, $stage) {
return $stage($carry);
},
$payload
);
};
}
// 示例使用
$process = pipeline([
function ($input) { return $input * 2; },
function ($input) { return $input + 10; },
function ($input) { return $input / 3; }
]);
echo $process(5); // 输出 6.666...
使用生成器实现 Pipeline
生成器可以按需处理数据流,适合大数据量场景:
function generatorPipeline(array $stages): Generator
{
$value = yield;
foreach ($stages as $stage) {
$value = $stage($value);
yield $value;
}
}
// 示例使用
$pipeline = generatorPipeline([
function ($x) { return $x + 1; },
function ($x) { return $x * 2; }
]);
$pipeline->send(5);
echo $pipeline->current(); // 输出 12
面向对象实现 Pipeline
通过类封装 Pipeline 逻辑,提供更好的可扩展性:

class Pipeline
{
private $stages = [];
public function addStage(callable $stage): self
{
$this->stages[] = $stage;
return $this;
}
public function process($payload)
{
foreach ($this->stages as $stage) {
$payload = $stage($payload);
}
return $payload;
}
}
// 示例使用
$pipeline = (new Pipeline())
->addStage(function ($x) { return $x * 3; })
->addStage(function ($x) { return $x - 1; });
echo $pipeline->process(5); // 输出 14
中间件风格的 Pipeline
适合 Web 中间件场景的实现方式:
class MiddlewarePipeline
{
private $middlewares = [];
private $index = 0;
public function addMiddleware(callable $middleware): void
{
$this->middlewares[] = $middleware;
}
public function handle($request, $next)
{
if (!isset($this->middlewares[$this->index])) {
return $next($request);
}
$middleware = $this->middlewares[$this->index];
$this->index++;
return $middleware($request, function ($request) use ($next) {
return $this->handle($request, $next);
});
}
}
// 示例使用
$pipeline = new MiddlewarePipeline();
$pipeline->addMiddleware(function ($req, $next) {
$req .= " middleware1";
return $next($req);
});
$pipeline->addMiddleware(function ($req, $next) {
$req .= " middleware2";
return $next($req);
});
$result = $pipeline->handle("request", function ($req) {
return $req . " final";
});
echo $result; // 输出 "request middleware1 middleware2 final"
Laravel 风格的 Pipeline
Laravel 框架提供了 Pipeline 实现,可以单独使用:
use Illuminate\Pipeline\Pipeline;
$pipeline = new Pipeline();
$result = $pipeline->send('data')
->through([
function ($passable, $next) {
return $next($passable . '-processed1');
},
function ($passable, $next) {
return $next($passable . '-processed2');
}
])
->then(function ($passable) {
return $passable . '-final';
});
echo $result; // 输出 "data-processed1-processed2-final"
每种实现方式适用于不同场景,闭包方式适合简单数据处理,生成器适合流式处理,面向对象方式提供更好扩展性,中间件风格适合请求处理流程。






