TigerZF
🌐Español

Capítulo 48. Zend_Memory

48.1. Resumen

48.1.1. Introducción

El componente Zend_Memory está diseñado para gestionar datos en un entorno con memoria limitada.

Los objetos de memoria (contenedores de memoria) son generados por el gestor de memoria bajo petición y son intercambiados/cargados de forma transparente cuando es necesario.

Por ejemplo, si crear o cargar un objeto gestionado provocara que el uso total de memoria superase el límite especificado, algunos objetos gestionados se copian a un almacenamiento de caché fuera de la memoria. De este modo, la memoria total utilizada por los objetos gestionados no supera el límite que se necesita imponer.

El gestor de memoria utiliza los backends de Zend_Cache como proveedores de almacenamiento.

Ejemplo 48.1. Uso del componente Zend_Memory

Zend_Memory::factory() instancia el objeto gestor de memoria con las opciones de backend especificadas.

$backendOptions = array(
    'cache_dir' => './tmp/' // Directory where to put the swapped memory blocks
);

$memoryManager = Zend_Memory::factory('File', $backendOptions);

$loadedFiles = array();

for ($count = 0; $count < 10000; $count++) {
    $f = fopen($fileNames[$count], 'rb');
    $data = fread($f, filesize($fileNames[$count]));
    $fclose($f);

    $loadedFiles[] = $memoryManager->create($data);
}

echo $loadedFiles[$index1]->value;

$loadedFiles[$index2]->value = $newValue;

$loadedFiles[$index3]->value[$charIndex] = '_';

48.1.2. Teoría de funcionamiento

El componente Zend_Memory opera con los siguientes conceptos:

  • Gestor de memoria

  • Contenedor de memoria

  • Objeto de memoria bloqueado

  • Objeto de memoria movible

48.1.2.1. Gestor de memoria

El gestor de memoria genera objetos de memoria (bloqueados o movibles) a petición de la aplicación de usuario y los devuelve envueltos en un objeto contenedor de memoria.

48.1.2.2. Contenedor de memoria

El contenedor de memoria tiene un atributo value virtual o real de tipo string. Este atributo contiene el valor de los datos especificado en el momento de crear el objeto de memoria.

Puede operar con este atributo value como si fuera una propiedad de objeto:

$memObject = $memoryManager->create($data);

echo $memObject->value;

$memObject->value = $newValue;

$memObject->value[$index] = '_';

echo ord($memObject->value[$index1]);

$memObject->value = substr($memObject->value, $start, $length);
[Note] Nota

Si está utilizando una versión de PHP anterior a la 5.2, use el método getRef() en lugar de acceder directamente a la propiedad value.

48.1.2.3. Memoria bloqueada

Los objetos de memoria bloqueados siempre se almacenan en memoria. Los datos almacenados en memoria bloqueada nunca se intercambian con el backend de caché.

48.1.2.4. Memoria movible

Los objetos de memoria movibles son intercambiados y cargados de forma transparente desde/hacia el backend de caché por Zend_Memory cuando es necesario.

El gestor de memoria no intercambia objetos con un tamaño inferior al mínimo especificado, por motivos de rendimiento. Consulte esta sección para más detalles.