【问题标题】:Is there a way to keep a php object in memory to avoid disk reads and wirtes?有没有办法将 php 对象保存在内存中以避免磁盘读取和写入?
【发布时间】:2012-02-24 16:05:10
【问题描述】:

所以我有一个从磁盘 gnugpg 读取文件的对象,它似乎总是在主目录中创建一个 gnugpg 密钥环。

我想避免每次从 apache 调用 php 脚本时都必须加载这个对象。

是否有一个 php 对象留在内存中?

【问题讨论】:

  • apc, memcache, memcached, shmop,只要它是可序列化的。
  • @Wrikken 你可能想添加 xcache,任何操作码缓存都是不错的选择
  • wincache 如果你在 Windows 服务器上

标签: php apache file-io gnupg


【解决方案1】:

如果它是一个不占用太多内存且可序列化的小对象,则可以将其存储在会话中:

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)来存储序列化对象,而不是会话。

【讨论】:

  • 感谢您的意见,我会看看所有这些。
猜你喜欢
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多