stream_wrapper_register

(PHP 4 >= 4.3.2, PHP 5)

stream_wrapper_register -- Registrar una envoltura URL implementada como una clase PHP

Descripción

bool stream_wrapper_register ( string protocolo, string nombre_clase )

stream_wrapper_register() le permite implementar sus propios gestores y secuencias de protocolo para su uso con todas las funciones de sistema de archivos (tales como fopen(), fread() etc.).

Para implementar una envoltura, necesita definir una clase con un número de funciones miembro, tal y como se define más adelante. Cuando alguien abre su secuencia mediante fopen, PHP creará una instancia de nombre_clase y luego llamará algunos métodos en esa instancia. Debe implementar los métodos exactamente como se describe a continuación - de no ser así, producirá comportamientos indefinidos.

Nota: A partir de PHP 5.0.0, la instancia de nombre_clase será poblada con una propiedad contexto que hace referencia a un Recurso de Contexto, el cual puede obtenerse con stream_context_get_options(). Si no se ha pasado ningún contexto a la función de creación de secuencia, contexto será definido como NULL.

stream_wrapper_register() devolverá FALSE si el protocolo ya tiene un gestor.

bool stream_open ( string ruta, string modo, int opciones, string ruta_abierta )

Este método es llamado inmediatamente después de que su objeto de secuencia es creado. ruta especifica la URL pasada a fopen() y que éste objeto supuestamente debe recuperar. Puede usar parse_url() para separar la ruta.

modo es el modo usado para abrir el archivo, tal y como se proporciona en fopen(). Usted es responsable por el chequeo de la validez del modo para la ruta solicitada.

opciones contiene banderas adicionales definidas por la interfaz de programación de las secuencias. Puede contener uno o más de los siguientes valores, unidos mediante la operación lógica OR.

BanderaDescripción
STREAM_USE_PATH Si ruta es relativa, buscar por el recurso usando include_path.
STREAM_REPORT_ERRORS Si esta bandera está activa, usted se hace responsable por la generación de errores usando trigger_error() durante la apertura de la secuencia. Si esta bandera no está definida, no debe generar ningún error.

Si la ruta es abierta satisfactoriamente, y STREAM_USE_PATH es definida en opciones, usted debe definir ruta_abierta como la ruta completa hacia el archivo/recurso que fue abierto en realidad.

Si el recurso solicitado fue abierto satisfactoriamente, debe devolver TRUE, o FALSE de lo contrario.

void stream_close ( void )

Este método es llamado cuando la secuencia es cerrada, usando fclose(). Debe liberar cualquier recurso que haya sido bloqueado o reservado por la secuencia.

string stream_read ( int conteo )

Este método es llamado en respuesta a llamadas de fread() y fgets() en la secuencia. Usted debe devolver hasta conteo bytes de datos desde su posición actual de lectura/escritura como una cadena. Si hay menos de conteo bytes disponibles, devuelva tantos como pueda. Si no hay más datos disponibles, devuelva FALSE o una cadena vacía. También debe actualizar la posición de lectura/escritura de la secuencia en el número de bytes que fueron leídos con éxito.

int stream_write ( string datos )

Este método es llamado en respuesta a llamadas de fwrite() en el sistema. Debe guardar datos en el modelo de almacenamiento base usado por su secuencia. Si no hay suficiente espacio disponible, intente almacenar tantos bytes como le sea posible. Debe devolver el número de bytes que fueron almacenados satisfactoriamente en la secuencia, o 0 si no fue posible almacenar ninguno. También debe actualizar la posición de lectura/escritura de la secuencia en el número de bytes que fueron escritos con éxito.

bool stream_eof ( void )

Este método es llamado en respuesta a llamados de feof() en la secuencia. Debe devolver TRUE si la posición de lectura/escritura se encuentra al final de la secuencia y no hay más datos disponibles para su lectura, o FALSE de lo contrario.

int stream_tell ( void )

Este método es llamado en respuesta a llamados de ftell() en la secuencia. Debe devolver la posición actual de lectura/escritura en la secuencia.

bool stream_seek ( int desplazamiento, int punto_partida )

Este método es llamado en respuesta a llamadas de fseek() en la secuencia. Debe actualizar la posición de lectura/escritua en la secuencia de acuerdo a desplazamiento y punto_partida. Vea fseek() para más información sobre éstos parámetros. Devuelva TRUE si la posición fue actualizada, FALSE de lo contrario.

bool stream_flush ( void )

Este método es llamado en respuesta a llamadas de fflush() en la secuencia. Si ha usado un caché con los datos de su secuencia, pero no los ha guardado aun en el modelo de almacenamiento base, debe hacerlo ahora. Devuelva TRUE si los datos en caché fueron almacenados satisfactoriamente (o si no habían datos a almacenar), o FALSE si los datos no pudieron ser almacenados.

array stream_stat ( void )

Este método es llamado en respuesta a llamadas de fstat() en la secuencia y debe devolver una matriz que contenga los mismos valores que sean apropiados para la secuencia.

bool unlink ( string ruta )

Este método es llamado en respuesta a llamadas de unlink() sobre rutas URL asociadas con la envoltura y debe intentar la eliminación del item especificado por ruta. Debe devolver TRUE de tener éxito o FALSE en caso de fallo. Para asegurarse de que el mensaje de error correcto sea devuelto, no defina éste método si su envoltura no soporta eliminaciones.

Nota: El método de envoltura en espacio de usuario unlink no es soportado antes de PHP 5.0.0.

bool rename ( string ruta_fuente, string ruta_destino )

Este método es llamado en respuesta a llamadas de rename() en rutas URL asociadas con la envoltura y debe intentar renombrar el item especificado por ruta_fuente a la cadena dada por ruta_destino. Debe devolver TRUE en caso de éxito o FALSE en caso de fallo. Para asegurarse de que el mensaje de error correcto sea devuelto, no defina éste método si su envoltura no soporta el renombramiento de rutas.

Nota: El método de envoltura en espacio de usuario rename no es soportado antes de PHP 5.0.0.

bool mkdir ( string ruta, int modo, int opciones )

Este método es llamado en respuesta a llamadas de mkdir() en rutas URL asociadas con la envoltura y debe intentar crear el directorio especificado por ruta. Debe devolver TRUE de tener éxito o FALSE en caso de fallo. Para asegurarse de que el mensaje de error correcto sea devuelto, no defina éste método si su envoltura no soporta la creación de directorios. Valores posibles para opciones incluyen STREAM_REPORT_ERRORS y STREAM_MKDIR_RECURSIVE.

Nota: El método de envoltura en espacio de usuario mkdir no es soportado antes de PHP 5.0.0.

bool rmdir ( string ruta, int opciones )

Este método es llamado en respuesta a llamadas de rmdir() sobre rutas URL asociadas con la envoltura y debería intentar eliminar el directorio especificado por ruta. Debe devolver TRUE de tener éxito o FALSE en caso de fallo. Para asegurarse de que el mensaje de error correcto sea devuelto, no defina éste método si su envoltura no soporta la eliminación de directorios. Posibles valores para opciones incluyen STREAM_REPORT_ERRORS.

Nota: El método de envoltura en espacio de usuario rmdir no es soportado antes de PHP 5.0.0.

bool dir_opendir ( string ruta, int opciones )

Este método es llamado inmediatamente cuando su objeto de secuencia es creado para examinar contenidos de directorio con opendir(). ruta especifica la URL que fue pasada a opendir() y que éste objeto supuestamente va a explorar. Puede usar parse_url() para separar ésta ruta.

array url_stat ( string ruta, int banderas )

Este método es llamado en respuesta a llamadas de stat() en rutas URL asociadas con la envoltura y debe devolver tantos elementos en común con la función del sistema como sea posible. Los valores desconocidos o no disponibles deben definirse con valores razonables (usualmente 0).

banderas contiene banderas adicionales definidas por la interfaz de programación de secuencias. Puede contener uno o más de los siguientes valores, unidos mediante la operación lógica OR.

BanderaDescripción
STREAM_URL_STAT_LINK Para recursos con la habilidad de mantener un enlace con otro recurso (tales como una redirección HTTP Location:, o un enlace simbólico en el sistema de archivos). Esta bandera indica que solo se devolverá información sobre el enlace mismo, no sobre el recurso apuntado por el enlace. Esta bandera es definida en respuesta a llamadas de lstat(), is_link(), o filetype().
STREAM_URL_STAT_QUIET Si ésta bandera es definida, su envoltura no debe generar error alguno. Si esta bandera no está definida, usted es responsable por el reporte de errores usando la función trigger_error() durante la ejecución del proceso stat en la ruta.

string dir_readdir ( void )

Este método es llamado en respuesta a readdir() y debe devolver una cadena que represente el siguiente nombre de archivo en la ubicación abierta por dir_opendir().

bool dir_rewinddir ( void )

Este método es llamado en respuesta a rewinddir() y debe restablecer la salida generada por dir_readdir(). Esto quiere decir, la siguiente llamada a dir_readdir() debe devolver la primera entrada en la ubicación devuelta por dir_opendir().

bool dir_closedir ( void )

Este método es llamado en respuesta a closedir(). Debe liberar cualquier recurso que haya sido bloqueado o reservado durante la apertura y uso de la secuencia de directorio.

El siguiente ejemplo implementa un gestor del protocolo var:// que permite el acceso para lectura/escritura a una variable global con nombre, usando las funciones de secuencia de sistema de archivos, como fread(). El protocolo var:// implementado a continuación leerá/escribirá datos desde/hacia $GLOBALS["foo"] dada la URL "var://foo".

Ejemplo 1. Una Secuencia para la lectura/escritura de variables globales

<?php

class SecuenciaVariable {
    var
$posicion;
    var
$nombre_var;
   
    function
stream_open($ruta, $modo, $opciones, &$ruta_abierta)
    {
        
$url = parse_url($ruta);
        
$this->nombre_var = $url["host"];
        
$this->posicion = 0;
        
        return
true;
    }

    function
stream_read($conteo)
    {
        
$ret = substr($GLOBALS[$this->nombre_var], $this->posicion, $conteo);
        
$this->posicion += strlen($ret);
        return
$ret;
    }

    function
stream_write($datos)
    {
        
$izq = substr($GLOBALS[$this->nombre_var], 0, $this->posicion);
        
$der = substr($GLOBALS[$this->nombre_var], $this->posicion + strlen($datos));
        
$GLOBALS[$this->nombre_var] = $izq . $datos . $der;
        
$this->posicion += strlen($datos);
        return
strlen($datos);
    }

    function
stream_tell()
    {
        return
$this->posicion;
    }

    function
stream_eof()
    {
        return
$this->posicion >= strlen($GLOBALS[$this->nombre_var]);
    }

    function
stream_seek($desplazamiento, $partida)
    {
        switch (
$partida) {
            case
SEEK_SET:
                if (
$desplazamiento < strlen($GLOBALS[$this->nombre_var]) && $desplazamiento >= 0) {
                     
$this->posicion = $desplazamiento;
                     return
true;
                } else {
                     return
false;
                }
                break;
                
            case
SEEK_CUR:
                if (
$desplazamiento >= 0) {
                     
$this->posicion += $desplazamiento;
                     return
true;
                } else {
                     return
false;
                }
                break;
                
            case
SEEK_END:
                if (
strlen($GLOBALS[$this->nombre_var]) + $desplazamiento >= 0) {
                     
$this->posicion = strlen($GLOBALS[$this->nombre_var]) + $desplazamiento;
                     return
true;
                } else {
                     return
false;
                }
                break;
                
            default:
                return
false;
        }
    }
}

stream_wrapper_register("var", "SecuenciaVariable")
    or die(
"Fall&oacute; el registro del protocolo");

$mi_var = "";
    
$da = fopen("var://mi_var", "r+");

fwrite($da, "linea1\n");
fwrite($da, "linea2\n");
fwrite($da, "linea3\n");

rewind($da);
while (!
feof($da)) {
    echo
fgets($da);
}
fclose($da);
var_dump($mi_var);

?>

Hosting by: hurra.com
Generated: 2007-01-26 18:01:07