miércoles, 25 de junio de 2025

Manipulación Avanzada de Streams con Filtros Personalizados en PHP

Manipulación Avanzada de Streams con Filtros Personalizados en PHP

PHP ofrece un poderoso sistema de streams que permite la manipulación de datos de diversas fuentes, como archivos, redes y memoria. Una característica menos conocida, pero extremadamente útil, es la capacidad de crear filtros de stream personalizados. Estos filtros permiten interceptar y modificar los datos a medida que fluyen a través del stream, proporcionando un control granular sobre la entrada y salida.

Los filtros de stream se implementan como clases que extienden la clase abstracta `php_user_filter`. Cada filtro debe implementar tres métodos principales: `filter()`, `onCreate()` y `onClose()`. El método `filter()` es el corazón del filtro, donde la lógica de transformación se aplica a los datos. `onCreate()` se llama cuando el filtro se crea, y `onClose()` cuando se destruye, permitiendo la inicialización y liberación de recursos.

A continuación, se muestra un ejemplo de un filtro personalizado que convierte texto a mayúsculas:


<?php

class UpperCaseFilter extends php_user_filter
{
    public function filter($in, $out, &$consumed, $closing)
    {
        $data = '';
        while ($bucket = stream_bucket_make_writeable($in)) {
            $data .= strtoupper($bucket->data);
            $consumed += $bucket->datalen;
        }

        $bucketout = stream_bucket_new($this->stream, $data);
        stream_bucket_append($out, $bucketout);

        return PSFS_PASS_ON; // Indica que el filtro ha procesado los datos.
    }

    public function onCreate()
    {
        return true; // Indica éxito en la creación.
    }

    public function onClose()
    {
        return true; // Indica éxito en el cierre.
    }
}

stream_filter_register("uppercase", "UpperCaseFilter");

$file = fopen("test.txt", "r+");
stream_filter_append($file, "uppercase");

while (!feof($file)) {
    echo fgets($file);
}

fclose($file);

?>
    

En este ejemplo, primero se define la clase `UpperCaseFilter`, que hereda de `php_user_filter`. El método `filter()` toma un bucket de datos de entrada, lo convierte a mayúsculas y lo añade a un nuevo bucket de salida. Luego, se registra el filtro con `stream_filter_register()`, asignándole el nombre "uppercase". Finalmente, se abre un archivo, se aplica el filtro al stream del archivo con `stream_filter_append()`, y se lee el contenido del archivo, que ahora estará en mayúsculas.

La manipulación de streams con filtros personalizados ofrece flexibilidad y control sobre el flujo de datos en PHP. Se pueden crear filtros para compresión, cifrado, validación o cualquier otra transformación necesaria. Esta técnica es especialmente útil cuando se trabaja con grandes volúmenes de datos o cuando se necesita modificar datos sobre la marcha sin cargarlos completamente en memoria.

No hay comentarios:

Publicar un comentario