PHP Streams函数

PHP stream_filter_register() 函数注册用户定义的流过滤器。它允许在与所有其他文件系统函数一起使用的任何注册流上实现用户定义的过滤器,例如 fopen()fread()

语法

stream_filter_register(filter_name, class) 

参数

filter_name必填。 指定要注册的过滤器名称。
class必填。 要实现过滤器,需要定义一个类作为 php_user_filter 的扩展,并具有许多成员函数。当对附加过滤器的流执行读/写操作时,PHP 将通过此过滤器(以及附加到该流的任何其他过滤器)传递数据,以根据需要修改数据。

返回值

成功时返回 true,失败时返回 false。如果 filter_name 已定义,则返回 false。

示例:过滤给定流上的大写字符

下面的示例实现一个名为 StrToUpper 的过滤器 test.txt 流上,该流将写入/读取的所有字母字符大写。

<?php
//定义过滤器类
class StrToUpper_filter extends php_user_filter {
  function filter($in, $out, &$consumed, $closing) {
    while ($bucket = stream_bucket_make_writeable($in)) {
      $bucket->data = strtoupper($bucket->data);
      $consumed += $bucket->datalen;
      stream_bucket_append($out, $bucket);
    }
    return PSFS_PASS_ON;
  }
}

//注册过滤器
stream_filter_register("StrToUpper", "StrToUpper_filter");

$fp = fopen("test.txt", "w");

//将注册的过滤器附加到流中
stream_filter_append($fp, "StrToUpper");

//将一些内容写入流
fwrite($fp, "This is a test file.\n");
fwrite($fp, "It contains dummy content.\n");
fwrite($fp, "Line number 3 is added.\n");

//关闭文件
fclose($fp);

//读取文件内容
readfile("test.txt");
?> 

上述代码的输出将是:

THIS IS A TEST FILE.
IT CONTAINS DUMMY CONTENT.
LINE NUMBER 3 IS ADDED. 

示例:注册通用过滤器类以匹配多个过滤器名称

考虑一个更多示例说明了注册通用过滤器类以匹配多个过滤器名称。

<?php
//定义过滤器类
class string_filter extends php_user_filter {
  var $mode;

  function filter($in, $out, &$consumed, $closing){
    while ($bucket = stream_bucket_make_writeable($in)) {
      if ($this->mode == 1) {
        $bucket->data = strtoupper($bucket->data);
      } elseif ($this->mode == 0) {
        $bucket->data = strtolower($bucket->data);
      }

      $consumed += $bucket->datalen;
      stream_bucket_append($out, $bucket);
    }
    return PSFS_PASS_ON;
  }

  function onCreate(){
    if ($this->filtername == 'str.toupper') {
      $this->mode = 1;
    } elseif ($this->filtername == 'str.tolower') {
      $this->mode = 0;
    } else {
      //调用其他一些str.*过滤器,返回false
      return false;
    }

    return true;
  }
}

//注册过滤器
stream_filter_register("str.*", "string_filter");

$fp = fopen("test.txt", "w");

//将注册的过滤器附加到流中
stream_filter_append($fp, "str.tolower");

//将一些内容写入流
fwrite($fp, "This is a test file.\n");
fwrite($fp, "It contains dummy content.\n");
fwrite($fp, "Line number 3 is added.\n");

//关闭文件
fclose($fp);

//读取文件内容
readfile("test.txt");
?> 

上述代码的输出将是:

this is a test file.
it contains dummy content.
line number 3 is added.