2012-02-01 11 views
5

Quindi ho un oggetto che legge un file da disk gnugpg sembra creare sempre un portachiavi gnugpg in una home directory.C'è un modo per mantenere un oggetto php in memoria per evitare letture e wirt?

Voglio evitare di caricare questo oggetto ogni volta che viene chiamato uno script php da apache.

è lì per avere un oggetto php rimanere in memoria?

+5

'apc',' memcache', 'memcached',' shmop', purché serializzabile. – Wrikken

+0

@Wrikken potresti voler aggiungere xcache, qualsiasi cache di opcode è un buon candidato –

+0

wincache se sei su un server Windows –

risposta

3

Se si tratta di un piccolo oggetto che non occupa molta memoria ed è serializzabile si può solo memorizzarlo nella sessione:

function getSessionObject($objectName, $params){ 

    $sessionObjectSerialized = getSessionVariable($objectName, FALSE); 

    if($sessionObjectSerialized == FALSE){ 
     $sessionObjectSerialized = constructSessionObject($objectName, $params); 
     setSessionVariable($objectName, $sessionObjectSerialized); 
    } 

    $sessionObject = unserialize($sessionObjectSerialized); 

    return $sessionObject; 
} 


function constructSessionObject($objectName, $params = array()){ 

    switch($objectName){ 

     case('gnugpg_key_ring'):{ 
      $gnugpgKeyRing = getGNUPGKeyRing(); //do whatever you need to do to make the keyring. 
      return serialize($countryScheme); 
     } 

     default:{ 
      throw new UnsupportedOperationException("Unknown object name objectName, cannot retrieve from session."); 
      break; 
     } 
    } 
} 

//Call this before anything else 
function initSession(){ 
    session_name('projectName'); 
    session_start(); 
} 

function setSessionVariable($name, $value){ 
    $_SESSION['projectName'][$name] = $value; 
} 

function getSessionVariable($name, $default = FALSE){ 

    if(isset($_SESSION['projectName'])){ 
     if(isset($_SESSION['projectName'][$name])){ 
      $value = $_SESSION['projectName'][$name]; 
     } 
    } 
    return $default; 
} 

e quindi recuperare l'oggetto chiamando

getSessionObject('gnugpg_key_ring'); 

Tuttavia, non tutti gli oggetti sono sempre serializzabili, ad es se l'oggetto contiene un handle di file su un file aperto, è necessario disporre di un codice aggiuntivo per chiudere il file quando l'oggetto viene serializzato e quindi riaprire il file quando l'oggetto non è stato serializzato.

Se l'oggetto è di grandi dimensioni, sarebbe meglio utilizzare uno strumento di memorizzazione nella cache corretto come memcached per memorizzare l'oggetto serializzato, piuttosto che la sessione.

+0

Grazie per il tuo contributo darò un'occhiata a tutto questo. – MrNemus

Problemi correlati