PHP Conference Japan 2024

stream_filter_append

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_filter_append向流中追加过滤器

说明

stream_filter_append(
    resource $stream,
    string $filtername,
    int $read_write = ?,
    mixed $params = ?
): resource

filtername 指定的过滤器追加到 stream 所关联的过滤器列表中。

参数

stream

目标流。

filtername

过滤器名称。

read_write

默认情况下,如果文件以读取模式打开(例如:文件模式:r 和/或 +),stream_filter_append() 会将过滤器附加到读过滤器链。如果文件以写入模式打开(例如:文件模式:wa 和/或 +),该过滤器也将被附加到写过滤器链。还可以向 read_write 参数传递 STREAM_FILTER_READSTREAM_FILTER_WRITE 和/或 STREAM_FILTER_ALL 来覆盖此行为。

params

此过滤器将被添加到具有指定 params 的列表的末尾,因此将在流操作期间最后调用。要将过滤器添加到列表的开头,请使用 stream_filter_prepend()

返回值

成功时返回一个资源,失败时返回 false。该资源可以用于在调用 stream_filter_remove() 时引用此过滤器实例。

如果 stream 不是资源,或者无法定位 filtername,则返回 false

范例

示例 #1 控制过滤器的应用位置

<?php
/* 打开一个用于读写操作的测试文件 */
$fp = fopen('test.txt', 'w+');

/* 将 ROT13 过滤器应用于
* 写过滤器链,但不应用于
* 读过滤器链 */
stream_filter_append($fp, "string.rot13", STREAM_FILTER_WRITE);

/* 向文件写入一个简单的字符串
* 它将在
* 输出时被 ROT13 转换 */
fwrite($fp, "This is a test\n");

/* 回到文件开头 */
rewind($fp);

/* 读回文件的内容。
* 如果过滤器也被应用于
* 读过滤器链,我们将看到
* 文本被 ROT13 转换回其原始状态 */
fpassthru($fp);

fclose($fp);

/* 预期输出
---------------

Guvf vf n grfg

*/
?>

注释

注意: 当使用自定义(用户)过滤器时
必须首先调用 stream_filter_register() 才能将所需的用户过滤器注册到 filtername

注意: 流数据以块的形式从资源(本地和远程)中读取,任何未消耗的数据都保存在内部缓冲区中。当将新过滤器追加到流时,内部缓冲区中的数据会在此时通过新过滤器进行处理。这与 stream_filter_prepend() 的行为不同。

注意: 当添加用于读取和写入的过滤器时,会创建两个过滤器实例。必须使用 STREAM_FILTER_READSTREAM_FILTER_WRITE 调用两次 stream_filter_append() 才能获得两个过滤器资源。

参见

添加注释

用户贡献的注释 2 条

up
7
Dan J
8 年前
请注意,通过 echo 或 print 输出时,应用于 STDOUT 的流过滤器不会被调用。

这很容易用标准的 ROT13 过滤器证明
<?php
stream_filter_append
( STDOUT, "string.rot13" );

print
"Hello PHP\n";
// 输出 "Hello PHP"

fprintf( STDOUT, "Hello PHP\n" );
// 输出 "Uryyb CUC"
?>

如果您想过滤 STDOUT,您可以使用 ob_start 添加的输出缓冲回调来获得更好的效果
https://php.net/manual/en/function.ob-start.php

在撰写本文时,有一个开放的 PHP 功能请求支持 echo 和 print 的流过滤器
https://bugs.php.net/bug.php?id=30583
up
4
net_navard at yahoo dot com
18 年前
大家好

在过滤器列表中首先或最后添加流过滤器的区别仅在于它们应用于流的顺序。

例如,如果您正在从文件中读取数据,并且使用 stream_filter_prepend() 将给定的过滤器放在首位,则数据将首先由该过滤器处理。

此示例读取文件数据,并在读取操作开始时应用过滤器

<?php
/* 打开一个用于读取的测试文件 */
$fp = fopen("test.txt", "r");
/* 将 ROT13 过滤器应用于
* 读过滤器链,但不应用于
* 写过滤器链 */
stream_filter_prepend($fp, "string.rot13",
STREAM_FILTER_READ);
// 读取文件数据
$contents=fread($fp,1024);
// 文件数据首先被过滤并存储在 $contents 中
echo $contents;
fclose($fp);
?>

另一方面,如果使用 stream_filter_append(),则过滤器将在数据操作结束时应用。关键在于过滤器应用于流的顺序。回到示例,从文件数据中删除换行符然后计算字符数与执行相反的过程是不一样的。在这种情况下,过滤器应用于流的顺序很重要。

此示例将测试字符串写入文件。过滤器在写入操作结束时应用

<?php
/* 打开一个测试文件以进行写入 */
$fp = fopen("test.txt", "w+");
/* 将 ROT13 过滤器应用于
* 写入过滤器链,但不应用于
* 读取过滤器链 */
stream_filter_append($fp, "string.rot13",
STREAM_FILTER_WRITE);
/* 向文件写入一个简单的字符串
* 它将在流操作结束时进行 ROT13 转换
* 输出 */
fwrite($fp, "This is a test\n"); // 字符串数据
首先被写入, 然后进行 ROT13 转换, 最后
写入文件
/* 回到文件开头 */
rewind($fp);
$contents=fread($fp,512);
fclose($fp);
echo
$contents;
?>

在第一种情况下,数据在写入操作结束时进行转换,而在第二种情况下,数据首先被过滤,然后存储在 $contents 中。

此致
侯赛因
To Top