🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
* [字符串过滤器](https://www.php.net/manual/zh/filters.string.php) * [string.strip\_tags](https://www.php.net/manual/zh/filters.string.strip_tags.php) * [转换过滤器](https://www.php.net/manual/zh/filters.convert.php) * [压缩过滤器](https://www.php.net/manual/zh/filters.compression.php) * [加密过滤器](https://www.php.net/manual/zh/filters.encryption.php) stream_get_filters()可以打印出支持的过滤,[**php文档的过滤器**](https://www.php.net/manual/zh/filters.string.php) 也有详细介绍 获取PHP内置的流: streamlist = stream_get_filters(); print_r($streamlist); 输出: Array ( [0] => convert.iconv.* [1] => mcrypt.* [2] => mdecrypt.* [3] => string.rot13 [4] => string.toupper [5] => string.tolower [6] => string.strip_tags [7] => convert.* [8] => consumed [9] => dechunk [10] => zlib.* [11] => bzip2.* ) **自定义过滤器:过滤器名可以随意取** ``` class md5_filter extends php_user_filter { function filter($in, $out, &$consumed, $closing) { while ($bucket = stream_bucket_make_writeable($in)) { $bucket->data = md5($bucket->data); $consumed += $bucket->datalen; stream_bucket_append($out, $bucket); } //数据处理成功,可供其它管道读取 return PSFS_PASS_ON; } } stream_filter_register("string.md5", "md5_filter"); ``` 这个过滤器的写法看起来很是有点摸不着头脑,事实上我们只需要看一下php_user_filter这个类的结构和内置方法即了解了 过滤器流最适合做的就是文件格式转换了,包括压缩,编解码等,除了这些“偏门”的用法外,filter流更有用的一个地方在于调试和日志功能,比如说在socket开发中,注册一个过滤器流进行log记录。比如下面的例子: ``` class md5_filter extends php_user_filter { public function filter($in, $out, &$consumed, $closing) { $data=""; while ($bucket = stream_bucket_make_writeable($in)) { $bucket->data = md5($bucket->data); $consumed += $bucket->datalen; stream_bucket_append($out, $bucket); } call_user_func($this->params, $data); return PSFS_PASS_ON; } } $callback = function($data) { file_put_contents("c:\log.txt",date("Y-m-d H:i")."\r\n"); }; ``` 这个过滤器不仅可以对输入流进行处理,还能回调一个函数来进行日志记录。 可以这么使用: ``` stream_filter_prepend($fp, "string.md5", STREAM_FILTER_WRITE,$callback); ``` PHP中的stream流系列函数中还有一个很重要的流,就是包装类流 streamWrapper。使用包装流可以使得不同类型的协议使用相同的接口操纵数据。