Cree objetos de memoria movibles usando el método create([$data])
del gestor de memoria:
$memObject = $memoryManager->create($data);
"Movible" significa que dichos objetos pueden intercambiarse (swap) y descargarse de la memoria y luego cargarse cuando el código de la aplicación acceda al objeto.
Cree objetos de memoria bloqueados usando el método createLocked([$data])
del gestor de memoria:
$memObject = $memoryManager->createLocked($data);
"Bloqueado" significa que dichos objetos nunca se intercambian ni descargan de la memoria.
Los objetos bloqueados proporcionan la misma interfaz que los objetos movibles
(Zend_Memory_Container_Interface).
Por lo que un objeto bloqueado puede usarse en cualquier lugar en vez de objetos movibles.
Es útil si una aplicación o un desarrollador puede decidir que algunos objetos nunca deben intercambiarse, por consideraciones de rendimiento.
El acceso a los objetos bloqueados es más rápido, porque el gestor de memoria no necesita rastrear cambios para estos objetos.
La clase de objetos bloqueados (Zend_Memory_Container_Locked)
garantiza prácticamente el mismo rendimiento que trabajar con una variable de tipo
string. La sobrecarga es una única desreferencia para obtener la propiedad de la clase.
Use la propiedad 'value' del contenedor de memoria (movible o bloqueado) para operar con los datos del objeto de memoria:
$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);
Una forma alternativa de acceder a los datos del objeto de memoria es usar el método getRef().
Este método debe usarse para versiones de PHP
anteriores a la 5.2. También puede que deba usarse en otros
casos por razones de rendimiento.
El contenedor de memoria proporciona los siguientes métodos:
public function &getRef();
El método getRef() devuelve una referencia al valor del objeto.
Los objetos movibles se cargan desde la caché en este momento si el objeto aún no está en memoria. Si el objeto se carga desde la caché, esto podría provocar el intercambio de otros objetos si el límite de memoria se superara al tener todos los objetos gestionados en memoria.
El método getRef() debe
usarse para acceder a los datos del objeto de memoria en versiones de PHP anteriores a la 5.2.
Rastrear los cambios en los datos necesita recursos adicionales.
El método getRef() devuelve una referencia a una cadena,
que es modificada directamente por la aplicación del usuario.
Por lo tanto, es buena idea usar el método getRef()
para el procesamiento de datos de valor:
$memObject = $memoryManager->create($data);
$value = &$memObject->getRef();
for ($count = 0; $count < strlen($value); $count++) {
$char = $value[$count];
...
}
public function touch();
El método touch() debe usarse en conjunto con
getRef(). Indica que el valor del objeto ha sido modificado:
$memObject = $memoryManager->create($data);
...
$value = &$memObject->getRef();
for ($count = 0; $count < strlen($value); $count++) {
...
if ($condition) {
$value[$count] = $char;
}
...
}
$memObject->touch();
public function lock();
El método lock() bloquea el objeto en memoria.
Debe usarse para evitar el intercambio de algunos objetos que usted elija.
Normalmente esto no es necesario, porque el gestor de memoria usa
un algoritmo inteligente para elegir candidatos para el intercambio.
Pero si sabe con certeza que en esta parte del código algunos
objetos no deben intercambiarse, puede bloquearlos.
Bloquear objetos en memoria también garantiza que la referencia
devuelta por el método getRef() sea válida hasta que
desbloquee el objeto:
$memObject1 = $memoryManager->create($data1);
$memObject2 = $memoryManager->create($data2);
...
$memObject1->lock();
$memObject2->lock();
$value1 = &$memObject1->getRef();
$value2 = &$memObject2->getRef();
for ($count = 0; $count < strlen($value2); $count++) {
$value1 .= $value2[$count];
}
$memObject1->touch();
$memObject1->unlock();
$memObject2->unlock();
public function unlock();
El método unlock() desbloquea el objeto cuando ya no
es necesario que esté bloqueado. Vea el ejemplo anterior.
public function isLocked();
El método isLocked() puede usarse para comprobar si el
objeto está bloqueado. Devuelve TRUE si el objeto
está bloqueado, o FALSE si no lo está.
Esto siempre es TRUE para los objetos "bloqueados",
y puede ser TRUE o FALSE
para los objetos "movibles".