2012-05-30 18 views
5

Estoy tratando de implementar un hashmap (matriz asociativa en PHP) en PHP que está disponible para toda la aplicación, es decir, almacenarlo en el contexto de la aplicación, no debe perderse cuando finalice el programa. ¿Cómo puedo lograr esto en PHP?hashmap en contexto de aplicación php

Gracias,

+1

PHP en sí no tiene 'contexto de aplicación'. Hay soluciones (es decir, almacenar cosas en archivos o memoria compartida), pero de lo contrario, nada sobrevive al final de la ejecución de un script PHP. – zneak

Respuesta

1

Si está utilizando la versión de php de Zend, es fácil.
No necesita serializar sus datos.
Solo se pueden almacenar en caché los contenidos. Recursos como Filehandles no pueden. Para almacenar verdadero/falso, use 1,0 para que pueda diferenciar una falla de la memoria caché de un resultado con ===.

tienda:

zend_shm_cache_store('cache_namespace::this_cache_name',$any_variable,$expire_in_seconds); 

Recuperar:

$any_variable = zend_shm_cache_fetch('cache_namespace::this_cache_name'); 

if ($any_variable === false) { 
    # cache was expired or did not exist. 
} 

Para los datos de larga vida que puede utilizar:

zend_disk_cache_store();zend_disk_cache_fetch(); 

Para los que no tienen Zend, las correspondientes versiones de APC de lo anterior:

Tienda:

apc_store('cache_name',$any_variable,$expire_in_seconds); 

Recuperar:

$any_variable = apc_fetch('cache_name'); 

if ($any_variable === false) { 
    # cache was expired or did not exist. 
} 

nunca utilizado cualquiera de los otros métodos mencionados. Si no tiene memoria compartida disponible, puede serializar/deserializar los datos en el disco. memoria del compartida por supuesto es mucho más rápido y lo bueno de Zend se maneja problemas de concurrencia para usted y permite espacios de nombres:

tiendas:

file_put_contents('/tmp/some_filename',serialize($any_variable)); 

Recuperar:

$any_variable = unserialize(file_get_contents('/tmp/some_filename')); 

Editar: Para manejar problemas de concurrencia usted mismo, creo que la manera más fácil sería usar el bloqueo. Todavía puedo ver la posibilidad de una condición de carrera en este código de psuedo entre el bloqueo existe y obtener el bloqueo, pero entiendes el punto.

pseudo código:

while (lock exists) { 
    microsleep; 
} 
get lock. 
check we got lock. 
write value. 
release lock. 
+0

No estoy usando ningún framework. ¿Cómo puedo hacer esto sin utilizar ningún framework – cldy1020

+0

? El framework se implementa por separado de la pila zend php. No estoy usando ningún framework tampoco. –

+0

Lo siento, no tengo la pila de Zend. ¿Cómo se manejan los problemas de concurrencia si uso la memoria compartida o APC (como lo menciona Alix Axel) – cldy1020

1

Puede utilizar APC o similars para esto, los datos que ponen habrá disponible en la memoria compartida.

Tenga en cuenta que esto no persistirá entre los reinicios del servidor, por supuesto.

+0

Gracias, ¿cuáles son las principales diferencias entre [APC] (http://www.php.net/manual/en/book.apc.php) y [memoria compartida] (http://www.php.net/manual /en/ref.shmop.php)? – cldy1020

Cuestiones relacionadas