2012-02-01 3 views
5

私はディスクgnugpgからファイルを読み込むオブジェクトを持っているので、常にホームディレクトリにgnugpgキーリングを作成しているようです。phpオブジェクトをメモリに保存してディスクの読み込みやワットを避ける方法はありますか?

私はPHPスクリプトがapacheから呼び出されるたびにこのオブジェクトを読み込まなければならないことを避けたいと思います。

PHPオブジェクトがメモリに残っていますか?

+5

'apc'、' memcache'、 'memcached'、' shmop'は、そのシリアライズ可能な限りです。 – Wrikken

+0

@Wrikken Windowsサーバーを使用している場合は、xcacheを追加することができます。すべてのopcodeキャッシュは良い候補です –

+0

wincache –

答えて

3

それは多くのメモリを占有していない小さなオブジェクトをだとあなただけのセッションでそれを格納することができ、シリアライズされた場合:

getSessionObject('gnugpg_key_ring'); 

を呼び出すことによって

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

し、そのオブジェクトを取得ただし、すべてのオブジェクトが常にシリアライズ可能なわけではありません。オブジェクトが開いているファイルへのファイルハンドルを保持している場合、そのオブジェクトをシリアル化するときにファイルを閉じ、オブジェクトがシリアル化されていないときにファイルを再オープンするコードが必要になります。

オブジェクトが大きい場合は、セッションではなくシリアル化されたオブジェクトを格納するmemcachedなどの適切なキャッシングツールを使用する方がよいでしょう。

+0

入力いただきありがとうございます。 – MrNemus

関連する問題