Есть ли способ сохранить объект php в памяти, чтобы избежать чтения и записи на диск? - PullRequest
5 голосов
/ 02 февраля 2012

Итак, у меня есть объект, который читает файл с диска gnugpg, который, кажется, всегда создает кольцо ключей gnugpg в домашнем каталоге.

Я хочу избежать загрузки этого объекта каждый раз, когда скрипт php вызывается из apache.

Есть ли где-нибудь, чтобы php-объект оставался в памяти?

1 Ответ

3 голосов
/ 02 февраля 2012

Если это небольшой объект, который не занимает много памяти и является сериализуемым, вы можете просто сохранить его в сеансе:

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, для хранения сериализованного объекта, а не сеанса.

...