CascadiaPHP 2024

stream_filter_append

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

stream_filter_appendAnexa um filtro a um fluxo

Descrição

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

Adiciona o nome do filtro filtername à lista de filtros anexados ao fluxo stream.

Parâmetros

stream

O fluxo alvo.

filtername

O nome do filtro.

read_write

Por padrão, stream_filter_append() irá anexar o filtro à cadeia de filtros de leitura se o arquivo foi aberto para leitura (isto é, modo de arquivo: r e/ou +). O filtro também será anexado à cadeia de filtros de escrita se o arquivo foi aberto para escrita (isto é, modo de arquivo: w, a e/ou +). As constantes STREAM_FILTER_READ, STREAM_FILTER_WRITE e/ou STREAM_FILTER_ALL também podem ser passadas ao parâmetro read_write para substituir este comportamento.

params

Este filtro será adicionado com os parâmetros especificados em params ao final da lista e portanto serão chamados por último durante operações de fluxo. Para adicionar um filtro ao início da lista, use stream_filter_prepend().

Valor Retornado

Retorna um recurso em caso de sucesso ou false em caso de falha. O recurso pode ser usado para se referir a este instância de filtro durante a chamada a stream_filter_remove().

false é retornado se o parâmetro stream não for um recurso ou se o nome do filtro filtername não puder ser localizado.

Exemplos

Exemplo #1 Controlando onde os filtros são aplicados

<?php
/* Abre um arquivo de teste para leitura e escrita */
$fp = fopen('test.txt', 'w+');

/* Applica o filtro ROT13 à
* cadeia de filtros de escrita, mas não à
* cadeia de filtros de leitura */
stream_filter_append($fp, "string.rot13", STREAM_FILTER_WRITE);

/* Escreve uma string simples ao arquivo
* que será transformado através do ROT13 na
* saída */
fwrite($fp, "This is a test\n");

/* Retrocede ao início do arquivo */
rewind($fp);

/* Lê de volta o conteúdo do arquivo.
* Se o filtro tivesse sido aplicado também
* à cadeia de filtros de leitura, seria visto o texto
* com o filtro ROT13 reaplicado, de volta a seu estado original */
fpassthru($fp);

fclose($fp);

/* Expected Output
---------------

Guvf vf n grfg

*/
?>

Notas

Nota: Usando filtros personalizados (do usuário)
stream_filter_register() deve ser chamado em primeiro lugar de maneira a registrar o filtro de usuário desejado para o valor de filtername.

Nota: Dados de fluxo são lidos dos recursos (tanto locais quanto remotos) em partes, com quaisquer dados não consumidos mantidos em buffers internos. Quando um novo filtro é anexado a um fluxo, dados no buffer interno são processados através do novo filtro neste momento. Isto difere do comportamento de stream_filter_prepend().

Nota: Quando um filtro é adicionado para leitura e escrita, duas instâncias do filtro são criadas. stream_filter_append() deve ser chamada duas vezes com STREAM_FILTER_READ e STREAM_FILTER_WRITE para obter ambos os recursos de filtro.

Veja Também

add a note

User Contributed Notes 5 notes

up
7
Dan J
8 years ago
Note that stream filters applied to STDOUT are not called when outputting via echo or print.

This is easily demonstrated with the standard ROT13 filter:
<?php
stream_filter_append
( STDOUT, "string.rot13" );

print
"Hello PHP\n";
// Prints "Hello PHP"

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

If you want to filter STDOUT, you may have better luck with an output buffering callback added via ob_start:
http://php.net/manual/en/function.ob-start.php

At the time of this writing, there is an open PHP feature request to support echo and print for stream filters:
https://bugs.php.net/bug.php?id=30583
up
7
dlvoy
15 years ago
While using compression filters on a large set of files during one script invocation i've got
Fatal error: Allowed memory size of xxx bytes exhausted
even when my max memory limit settings was insane high (128MB)

Workaround is to remember to remove filter after work done with stream_filter_remove:

<?php
foreach($lot_of_files as $filename)
{
$fp = fopen($filename, 'rb');
$filter_params = array('level' => 2, 'window' => 15, $memory => 6);
$s_filter = stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_READ, $filter_params);
// here stream-operating code

stream_filter_remove($s_filter);

fclose($fp);
}
?>
up
4
net_navard at yahoo dot com
18 years ago
Hello firends

The difference betweem adding a stream filter first or last in the filte list in only the order they will be applied to streams.

For example, if you're reading data from a file, and a given filter is placed in first place with stream_filter_prepend()the data will be processed by that filter first.

This example reads out file data and the filter is applied at the beginning of the reading operation:

<?php
/* Open a test file for reading */
$fp = fopen("test.txt", "r");
/* Apply the ROT13 filter to the
* read filter chain, but not the
* write filter chain */
stream_filter_prepend($fp, "string.rot13",
STREAM_FILTER_READ);
// read file data
$contents=fread($fp,1024);
// file data is first filtered and stored in $contents
echo $contents;
fclose($fp);
?>

On the other hand, if stream_filter_append() is used, then the filter will be applied at the end of the data operation. The thing about this is only the order filters are applied to streams. Back to the example, it's not the same thing removing new lines from file data and then counting the number of characters, than performing the inverse process. In this case, the order that filters are applied to stream is important.

This example writes a test string to a file. The filter is applied at the end of the writing operation:

<?php
/* Open a test file for writing */
$fp = fopen("test.txt", "w+");
/* Apply the ROT13 filter to the
* write filter chain, but not the
* read filter chain */
stream_filter_append($fp, "string.rot13",
STREAM_FILTER_WRITE);
/* Write a simple string to the file
* it will be ROT13 transformed at the end of the
stream operation
* way out */
fwrite($fp, "This is a test\n"); // string data is
first written, then ROT13 tranformed and lastly
written to file
/* Back up to the beginning of the file */
rewind($fp);
$contents=fread($fp,512);
fclose($fp);
echo
$contents;
?>

In the first case, data is transformed at the end of the writing operation, while in the second one, data is first filtered and then stored in $contents.

With Regards
Hossein
up
1
Sbastien
2 years ago
Available internal filters are listed here :

https://www.php.net/manual/filters.php
up
0
TingSong
1 year ago
To decompress a gzipped stream:

<?php
$stream
= $s3_client->getReadStream('somefile.csv.gz');
stream_filter_append($stream, 'zlib.inflate', STREAM_FILTER_READ, ['window' => 15+16]);

// read the decompressed line directly
$line = fgets($stream);
$columns = str_getcsv($line);

// process the data in columns
?>

As the doc of zlib https://www.zlib.net/manual.html#Advanced

The 'window' parameter between 8 and 15 specified the window size from 2⁸ to 2¹⁵ bytes. It can be added by 16 for wrapping with gzip header and trailer instead of zlib wrapper.

And, window could be -8..-15 for unwrapping RAW deflate data.
To Top