Php - 将流复制到自身

时间:2014-04-11 09:58:57

标签: php stream

我想在php://input信息流上执行操作,但也要将其返回。

例如,我想要实现的是:

php://input ==> OPERATION ==> php://input

是否可以制作类似的东西?

$input = fopen("php://input", "r");
$output = fopen("php://input", "w");
while (($buffer.= fgets($input, 1024)) !== false) {
  // Do something with that buffer
  // ??
  fwrite($output, $buffer);

}
fclose($output);
fclose($input);

1 个答案:

答案 0 :(得分:2)

如果你在php中支持filter之一的操作很好,你可以使用php://filter fopen wrapper

假设你想对数据进行base64解码,例如:

$data = file_get_contents('php://filter/read=convert.base64-decode/resource=php://input');

或者:

$input = fopen('php://filter/read=convert.base64-decode/resource=php://input');
// now you can pass $input to somewhere and every read operation will 
// return base64 decoded data ...

但是,PHP中作为过滤器支持的操作集非常有限。如果它不符合您的需要,我建议在类中包装文件指针。这里有一个非常基本的例子,你可以添加缓冲,缓存或其他......

class Input {

    public static function read() {
        return $this->process(file_get_contents('php://stdin'));
    }


    public function process($data) {
        return do_whatever_with($data);
    }

}

然后在应用程序代码中使用:

$input = Input::read();