2012-05-30 4 views
5

Sto cercando di implementare una hashmap (array associativo in PHP) in PHP, che è disponibile a livello di applicazione e lo memorizzo nel contesto dell'applicazione, non dovrebbe essere perso al termine del programma. Come posso ottenere questo in PHP?hashmap nel contesto dell'applicazione php

Grazie,

+1

PHP sé non ha alcun 'contesto di applicazione'. Ci sono soluzioni alternative (vale a dire la memorizzazione di materiale in file o memoria condivisa), ma in caso contrario, nulla sopravvive alla fine dell'esecuzione di uno script PHP. – zneak

risposta

1

Se si utilizza la versione Zend di php, è facile.
Non è necessario serializzare i dati.
Solo i contenuti possono essere memorizzati nella cache. Risorse come i filehandle non possono. Per memorizzare true/false, utilizzare 1,0 in modo da poter distinguere un errore di cache da un risultato con ===.

Store:

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

Recupera:

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

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

Per i dati vissuto a lungo è possibile utilizzare:

zend_disk_cache_store();zend_disk_cache_fetch(); 

Per quelli senza Zend, le corrispondenti versioni APC di cui sopra:

Store:

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

Recupera:

$any_variable = apc_fetch('cache_name'); 

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

mai usato uno qualsiasi degli altri metodi citati. Se non si dispone di memoria condivisa, è possibile serializzare/unserializzare i dati su disco. memoria Naturalmente condivisa è molto più veloce e la cosa bella di Zend è gestisce problemi di concorrenza per voi e consente spazi dei nomi:

Store:

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

Retrieve:

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

Modifica: Per gestire problemi di concorrenza voi stessi, penso che il modo più semplice sarebbe utilizzare il blocco. Posso ancora vedere la possibilità di una condizione di competizione in questo codice psuedo tra il blocco esiste e ottenere il blocco, ma ottieni il punto.

codice Psuedo:

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

Non sto usando alcun framework. come posso fare questo senza usare alcun framework – cldy1020

+0

Il framework è implementato separatamente dallo stack php zend. Neanche io sto usando alcun framework. –

+0

Spiacente, non ho stack Zend. Come vengono gestiti i problemi di concorrenza se utilizzo Shared memory o APC (come menzionato da Alix Axel) – cldy1020

1

È possibile utilizzare APC o similars per questo, i dati messi lì sarà disponibile nella memoria condivisa.

Tenere a mente che ciò non persisterà tra riavvii del server, naturalmente.

+0

Grazie, quali sono le principali differenze tra [APC] (http://www.php.net/manual/en/book.apc.php) e [memoria condivisa] (http://www.php.net/manual /en/ref.shmop.php)? – cldy1020