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.
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.
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ó 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);
?>
|
|