1--TEST--
2Check if multiple filters are closed correctly and never called again after close
3--FILE--
4<?php
5
6class FirstFilter extends php_user_filter {
7    public function filter($in, $out, &$consumed, $closing): int {
8        static $closed = 0;
9
10        while ($bucket = stream_bucket_make_writeable($in)) {
11            stream_bucket_append($out, stream_bucket_new($this->stream, $bucket->data));
12        }
13
14        if ($closing) {
15            $closed++;
16        }
17
18        if ($closed > 0) {
19            var_dump($closed++);
20        }
21        return PSFS_PASS_ON;
22    }
23}
24
25class SecondFilter extends php_user_filter {
26    public function filter($in, $out, &$consumed, $closing): int {
27        static $closed = 0;
28
29        while ($bucket = stream_bucket_make_writeable($in)) {
30            stream_bucket_append($out, stream_bucket_new($this->stream, $bucket->data));
31        }
32
33        if ($closing) {
34            $closed++;
35        }
36
37        if ($closed > 0) {
38            var_dump($closed++);
39        }
40        return PSFS_PASS_ON;
41    }
42}
43
44$r = fopen("php://stdout", "w+");
45stream_filter_register("first", "FirstFilter");
46stream_filter_register("second", "SecondFilter");
47$first = stream_filter_prepend($r, "first", STREAM_FILTER_WRITE, []);
48$second = stream_filter_prepend($r, "second", STREAM_FILTER_WRITE, []);
49fwrite($r, "test\n");
50stream_filter_remove($second);
51stream_filter_remove($first);
52?>
53--EXPECT--
54test
55int(1)
56int(1)
57