Stream是PHP开发里最容易被忽视的函数系列(SPL系列,Stream系列,pack函数,封装协议)之一,但其是个很有用也很重要的函数。Stream可以翻译为“流”,在Java里,流是一个很重要的概念。
流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。根据流的方向又可以分为输入流和输出流,同时可以在其外围再套上其它流,比如缓冲流,这样就可以得到更多流处理方法。
PHP里的流和Java里的流实际上是同一个概念,只是简单了一点。由于PHP主要用于Web开发,所以“流”这块的概念被提到的较少。如果有Java基础,对于PHP里的流就更容易理解了。其实PHP里的许多高级特性,比如SPL,异常,过滤器等都参考了Java的实现,在理念和原理上同出一辙。
stream_filter_register
版本支持(PHP 5、PHP 7、PHP 8)
stream_filter_register —注册用户定义的流过滤器
说明
stream_filter_register ( string $filter_name , string $class ): bool
stream_filter_register()允许您在与所有其他文件系统函数(例如fopen()、 fread()等)一起使用的任何注册流上实现您自己的过滤器。
参数
filter_name
要注册的过滤器名称。
class
要实现过滤器,您需要定义一个类作为具有多个成员函数的php_user_filter的扩展 。当对过滤器附加到的流执行读/写操作时,PHP 将通过您的过滤器(以及附加到该流的任何其他过滤器)传递数据,以便可以根据需要修改数据。您必须完全按照 php_user_filter 中的描述实现方法- 否则将导致未定义的行为。
返回值
成功时返回 true, 或者在失败时返回 false。
false如果 filter_name 已经定义, stream_filter_register() 将返回。
示例
过滤 foo-bar.txt 流中的大写字符
下面的示例实现了一个 strtoupper 在 foo-bar.txt 流上命名的过滤器,它将大写写入/读取该流的所有字母字符。
<?php
/* Define our filter class */
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;
}
}
/* Register our filter with PHP */
stream_filter_register("strtoupper", "strtoupper_filter")
or die("Failed to register filter");
$fp = fopen("foo-bar.txt", "w");
/* Attach the registered filter to the stream just opened */
stream_filter_append($fp, "strtoupper");
fwrite($fp, "Line1\n");
fwrite($fp, "Word - 2\n");
fwrite($fp, "Easy As 123\n");
fclose($fp);
/* Read the contents back out
*/
readfile("foo-bar.txt");
以上例程会输出:
LINE1
WORD - 2
EASY AS 123
PHP中的stream流系列函数中还有一个很重要的流,就是包装类流 streamWrapper。使用包装流可以使得不同类型的协议使用相同的接口操纵数据。