Gestión avanzada de archivos de PHP 5

Opciones de permisos, almacenamiento en caché y metadatos

El envoltorio de flujo de App Engine para Cloud Storage ofrece las siguientes opciones para configurar el flujo:

Opción Valores posibles Descripción
acl Uno de los siguientes valores:
  • private
  • public-read
  • public-read-write
  • authenticated-read
  • bucket-owner-read
  • bucket-owner-full-control
  • proyecto-privada (project-private)
Para ver descripciones de lo que hacen estos ajustes en Cloud Storage, consulta Listas de control de acceso predefinidas. Si no defines acl, Cloud Storage asigna el valor null a este parámetro y usa la LCA de objeto predeterminada asociada al contenedor que contiene el archivo.
Content-Type Cualquier tipo MIME válido Si no especifica un tipo de contenido al subir un objeto, el sistema de Google Cloud Storage utilizará binary/octet-stream de forma predeterminada cuando publique el objeto.
Content-Disposition Cualquier valor de Content-Disposition válido Un encabezado que puedes establecer en un objeto que especifica información de presentación sobre cómo se tienen que transmitir los datos del objeto.
Content-Encoding Cualquier algoritmo de compresión válido Algoritmo de compresión del objeto, como gzip. Ten en cuenta que Google Cloud Storage no comprime ni descomprime automáticamente los objetos en función de este encabezado.
Content-Language Cualquier código de idioma ISO 639-1 válido El código de idioma ISO 639-1 del contenido (consulta la lista completa en Codes for the Representation of Names of Languages).
enable_cache verdadero o falso (verdadero de forma predeterminada) Los archivos que se leen de Cloud Storage se almacenan en caché en la memoria (consulta memcache) para mejorar el rendimiento. El almacenamiento en caché se puede desactivar mediante la directiva enable_cache en el contexto de la emisión.
enable_optimistic_cache verdadero o falso (falso de forma predeterminada) Puedes habilitar el almacenamiento en caché optimista para leer el objeto de archivo de la caché sin comprobar si el objeto subyacente se ha modificado en Cloud Storage desde la última vez que se almacenó en caché. El almacenamiento en caché optimista es ideal para situaciones en las que se escribe una vez y se lee muchas veces.
metadata Una matriz asociativa, por ejemplo: ['foo' => 'far', 'bar' => 'boo'] Consulta Lectura y escritura de metadatos personalizados.
read_cache_expiry_seconds Número de segundos que un objeto seguirá siendo válido en la caché. Puedes cambiar el tiempo que un objeto almacenado en caché permanece válido mediante el read_cache_expiry_seconds directive. Especifica el tiempo transcurrido el cual el objeto se volverá a almacenar en caché en el siguiente intento de lectura. De forma predeterminada, se establece en 1 hora (3600).
writable_cache_expiry_seconds Número de segundos que se almacena en caché el estado de escritura de un segmento. El envoltorio de flujo de Cloud Storage almacena en caché el estado de escritura de los segmentos para mejorar el rendimiento. Esto significa que los bits de escritura devueltos por varias funciones relacionadas con stat() pueden estar desincronizados temporalmente cuando cambia la LCA del segmento. De forma predeterminada, está fijado en 10 minutos (600).

En el siguiente fragmento se muestra cómo usar las opciones de la secuencia:

$options = ['gs' => ['Content-Type' => 'text/plain']];
$context = stream_context_create($options);
file_put_contents("gs://${my_bucket}/hello_options.txt", $newFileContent, 0, $context);

En el fragmento de código anterior, $options es un conjunto de argumentos que usará el flujo al escribir objetos nuevos. Se pueden definir como opciones predeterminadas con stream_context_set_default.

Compatibilidad con funciones del sistema de archivos de PHP 5 en Cloud Storage

El envoltorio de flujo de App Engine para Cloud Storage admite muchas funciones nativas del sistema de archivos de PHP. Algunas funciones no se admiten y otras se han modificado. En la siguiente tabla se enumeran todas estas funciones nativas y se indica si se admiten o no. Si una función es compatible, pero con modificaciones o limitaciones, se describen.

Función de sistema de archivos ¿Es compatible? Detalles
basename: devuelve el componente de nombre final de la ruta. Compatible.
chgrp cambia el grupo de archivos. No es compatible. Siempre devuelve false.
chmod cambia el modo de archivo. No es compatible. Siempre devuelve false.
chown: cambia el propietario del archivo. No es compatible. Siempre devuelve false.
clearstatcache: borra la caché de estado de los archivos. Compatible.
Copiar: copia el archivo. Compatible.
dirname: devuelve la ruta del directorio principal. Compatible. Es compatible, pero incluye el prefijo gs://.
disk_free_space devuelve el espacio disponible en el sistema de archivos o en la partición del disco. No es compatible. Esta opción está inhabilitada.
disk_total_space: devuelve el tamaño total de un sistema de archivos o una partición de disco. No es compatible. Esta opción está inhabilitada.
diskfreespace alias de disk_free_space.
fclose: cierra un puntero de archivo abierto. Compatible.
feof: comprueba si se ha llegado al final de un archivo en un puntero de archivo. Compatible.
fflush: vacía la salida en un archivo. Compatible. No tiene ningún efecto. (Siempre devuelve true).
fgetc obtiene un carácter de un puntero de archivo. Compatible.
fgetcsv: obtiene una línea de un puntero de archivo y la analiza para obtener los campos CSV. Compatible.
fgets: obtiene una línea de un puntero de archivo. Compatible.
fgetss: obtiene una línea de un puntero de archivo y elimina las etiquetas HTML. Compatible.
file_exists: comprueba si existe un archivo o un directorio. Compatible.
file_get_contents lee todo el archivo en una cadena. Compatible.
file_put_contents: escribe una cadena en un archivo. Compatible.
file: lee todo el archivo en una matriz. Compatible.
fileatime: obtiene la hora del último acceso al archivo. No es compatible. Siempre devuelve 0.
filectime: obtiene la hora de cambio del inode del archivo. No es compatible. Siempre devuelve 0.
filegroup: obtiene un grupo de archivos. No es compatible. Siempre devuelve 0.
fileinode: obtiene el inode del archivo. No es compatible. Siempre devuelve 0.
filemtime: obtiene la hora de modificación del archivo. Compatible.
fileowner: obtiene el propietario del archivo. No es compatible. Siempre devuelve 0.
fileperms: obtiene los permisos de un archivo. Compatible. El bit de ejecución siempre está desactivado.
filesize: obtiene el tamaño del archivo. Compatible.
filetype: obtiene el tipo de archivo. Compatible.
flock: bloqueo de archivos de asesoramiento portátil. No se admite. Siempre devuelve false.
fopen abre un archivo o una URL. Compatible. Solo admite estos modos: r, rb, rt, w, wb y wt.
fpassthru muestra todos los datos restantes de un puntero de archivo. Compatible.
fputcsv: da formato a una línea como CSV y la escribe en un puntero de archivo. Compatible.
fputs: alias de fwrite.
fread: lectura de archivos segura para binarios. Compatible.
fscanf: analiza la entrada de un archivo según un formato. Compatible.
fseek busca en un puntero de archivo. Compatible. Solo admite archivos abiertos en modo de lectura.
fstat obtiene información sobre un archivo mediante un puntero de archivo abierto. Compatible.
ftell: devuelve la posición actual del puntero de lectura/escritura del archivo. Compatible.
ftruncate: trunca un archivo a una longitud determinada. No es compatible. Siempre devuelve false.
fwrite: escribe en un archivo de forma segura para datos binarios. Compatible.
glob: busca nombres de ruta que coincidan con un patrón. Compatible.
is_dir indica si el nombre de archivo es un directorio. Compatible.
is_executable indica si el nombre de archivo es ejecutable. No es compatible. Siempre devuelve false.
is_file: indica si el nombre de archivo es un archivo normal. Compatible.
is_link indica si el nombre de archivo es un enlace simbólico. No es compatible. Siempre devuelve false.
is_readable indica si un archivo existe y se puede leer. Compatible.
is_uploaded_file indica si el archivo se ha subido mediante HTTP POST. Compatible.
is_writable indica si se puede escribir en el nombre de archivo. Compatible. El valor se almacena en caché y es posible que no refleje los cambios de permisos inmediatamente.
is_writeable alias de is_writable.
lchgrp: cambia la propiedad del grupo de un enlace simbólico. No es compatible. Esta opción está inhabilitada.
lchown: cambia la propiedad de usuario de un enlace simbólico. No es compatible. Esta opción está inhabilitada.
link: crea un enlace duro. No es compatible. Esta opción está inhabilitada.
linkinfo obtiene información sobre un enlace. No es compatible. Siempre devuelve -1.
lstat proporciona información sobre un archivo o un enlace simbólico. Compatible.
mkdir crea un directorio. Compatible.
move_uploaded_file: mueve un archivo subido a una nueva ubicación. Compatible.
parse_ini_file: analiza un archivo de configuración. Compatible.
pathinfo: devuelve información sobre una ruta de archivo. Compatible.
pclose: cierra el puntero del archivo de proceso. No es compatible. Esta opción está inhabilitada.
popen: abre un puntero de archivo de proceso. No es compatible. Esta opción está inhabilitada.
readfile muestra el contenido de un archivo. Compatible.
readlink devuelve el destino de un enlace simbólico. No es compatible. Siempre devuelve false.
realpath: devuelve el nombre de ruta absoluto canonicalizado. No es compatible. Siempre devuelve false.
rename: cambia el nombre de un archivo o un directorio. Compatible.
rewind: retrocede la posición de un puntero de archivo. Compatible. Solo se admite en el modo de lectura.
rmdir: elimina el directorio. Compatible.
set_file_buffer: alias de stream_set_write_buffer.
stat: proporciona información sobre un archivo. Compatible.
symlink: crea un enlace simbólico. No es compatible. Esta opción está inhabilitada.
tempnam: crea un archivo con un nombre único. Compatible. Consulta estas notas.
tmpfile: crea un archivo temporal. Compatible. Devuelve un archivo respaldado en memoria similar a php://memory.
touch: define la hora de acceso y de modificación del archivo. No es compatible. Siempre devuelve false.
umask: cambia la umask actual. Compatible. No se aplica a los archivos de Cloud Storage.
unlink: elimina un archivo. Compatible.

Ten en cuenta que las funciones de estadísticas de archivos de la tabla anterior (file_exists, filemtime, filesize, fstat, is_file, is_dir, is_writable y stat) se almacenan en caché por solicitud. Para borrar esta caché, llama a clearstatcache.

Además, se admiten las siguientes funciones de lectura de directorios de PHP:

Nombre de la función
opendir
readdir
rewinddir
closedir

Usar include y require en PHP 5

Para mantener la seguridad de tu aplicación, la capacidad de include o require desde un archivo de Cloud Storage está inhabilitada de forma predeterminada, pero puedes habilitarla de la siguiente manera:

Para include o require código PHP de Google Cloud Storage en tu aplicación, debes especificar qué contenedores contienen esos archivos mediante la directiva google_app_engine.allow_include_gs_buckets en tu archivo php.ini.

Leer y escribir metadatos personalizados

Para adjuntar metadatos personalizados a un archivo que se está escribiendo en Google Cloud Storage, añade los metadatos a $options antes de crear el contexto de la secuencia que se usa en la llamada file_put_contents.

En este ejemplo, a los metadatos llamados foo se les asigna el valor far y a los llamados bar se les asigna el valor boo. En el ejemplo también se asigna el valor text/plain al tipo de contenido. El contexto de la secuencia se crea con esta información en $options, tal como se muestra, y el archivo se escribe en Cloud Storage mediante file_put_contents(), junto con los metadatos y el tipo de contenido:

$metadata = ['foo' => 'bar', 'baz' => 'qux'];
$options = [
    'Content-Type' => 'text/plain',
    'metadata' => $metadata
];
$context = stream_context_create(['gs' => $options]);
file_put_contents("gs://${my_bucket}/hello_metadata.txt", $newFileContent, 0, $context);

Para leer los metadatos personalizados y el tipo de contenido de un archivo, llama a fopen en el archivo y, a continuación, usa CloudStorageTools::getContentType() para obtener el tipo de contenido y CloudStorageTools::getMetaData() para obtener los metadatos.

Los metadatos personalizados y el tipo de contenido están disponibles una vez que se devuelve el puntero de archivo de la llamada fopen.

$fp = fopen("gs://${my_bucket}/hello_metadata.txt", 'r');
$content_type = CloudStorageTools::getContentType($fp);
$metadata = CloudStorageTools::getMetaData($fp);

Lecturas de archivos en caché

De forma predeterminada, el envoltorio de flujo de App Engine para Cloud Storage almacena en caché las lecturas de archivos en memcached para mejorar el rendimiento en lecturas posteriores. El almacenamiento en caché se puede desactivar mediante la directiva enable_cache en el contexto de la emisión.

Para mejorar aún más el rendimiento, también puedes habilitar el almacenamiento en caché optimista, que leerá el objeto de archivo de la caché sin comprobar si el objeto subyacente se ha modificado en Google Cloud Storage desde la última vez que se almacenó en caché, mediante la directiva enable_optimistic_cache (que tiene el valor false de forma predeterminada). El almacenamiento en caché optimista es ideal para situaciones en las que se escribe una vez y se lee muchas veces.

También puedes cambiar el tiempo que un objeto almacenado en caché permanece válido mediante la directiva read_cache_expiry_seconds. Después de ese tiempo, el objeto se volverá a almacenar en caché en el siguiente intento de lectura. De forma predeterminada, se establece en 1 hora (3600).

En este ejemplo, el almacenamiento en caché optimista está activado y los objetos de archivo están configurados para que se marquen para volver a almacenarse en caché desde Google Cloud Storage después de 5 minutos.

$options = [
    'gs' => [
        'enable_cache' => true,
        'enable_optimistic_cache' => true,
        'read_cache_expiry_seconds' => 300,
    ]
];
$context = stream_context_create($options);
file_put_contents("gs://${my_bucket}/hello_caching.txt", $newFileContent, 0, $context);