2012-02-01 57 views
5

所以我有一個從磁盤gnugpg讀取文件的對象,它總是在主目錄中創建一個gnugpg鑰匙圈。有沒有辦法在內存中保留一個php對象,以避免磁盤讀取和wirtes?

我想避免每次從apache調用php腳本時都必須加載此對象。

是否有一個PHP對象留在內存中?

+5

'apc',''memcache','memcached','shmop',只要它是可序列化的。 – Wrikken 2012-02-01 23:24:48

+0

@Wrikken你可能想要添加xcache,任何操作碼緩存都是很好的候選人 – 2012-02-01 23:47:55

+0

wincache如果你在一個Windows服務器上 – 2012-02-02 00:06:54

回答

3

如果它是一個小的物體,不佔用太多的內存和可序列化,你可以只把它存儲在會話:

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; 
} 

,然後檢索該對象通過調用

getSessionObject('gnugpg_key_ring'); 

然而並非所有對象都是可序列化的,例如如果對象擁有打開文件的文件句柄,那麼在對象序列化時需要一些額外的代碼來關閉文件,然後在對象被反序列化時重新打開文件。

如果對象很大,那麼使用適當的緩存工具(如memcached)來存儲序列化對象而不是會話會更好。

+0

感謝你的輸入我會看看所有這些。 – MrNemus 2012-02-02 16:48:39

相關問題