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) { 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) { 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