Создание / запись файла PHP в деструкторе

При вызове file_put_contents () в деструкторе он приводит к записи файлов в SERVER_ROOT .. . (Ура!) Обходные пути?

tldr:

Я хочу кэшировать массив, вероятно, содержащий сериализованные экземпляры класса. Я решил, что на данный момент я напишу класс, реализующий кеш, используя unserialize () / file_get_contents () и serialize () / file_put_contents () , а затем скрою его функциональность за более общий класс Cache. (Я не знаю, будет ли у моего клиента общая память или PEAR и т. Д.)

<?php
    class CacheFile {
        private $filename;
        private $data;
        private $dirty = false;

        function __construct($filename) {
            $this->filename = $filename;
            $this->load();
        }

        function __destruct() {
            // Calling file_put_contents within a destructor causes files to be written in SERVER_ROOT...
            $this->flush();
        }

        private function load() {
            if(!file_exists($this->filename)) {
                $this->data = array();
            }
            else {
                $this->data = unserialize(file_get_contents($this->filename));
                // todo
            }
            $this->dirty = false;
        }

        private function persist() {
            file_put_contents($this->filename, serialize($this->data));
            $this->dirty = false;
        }

        public function get($key) {
            if(array_key_exists($key, $this->data)) {
                return $this->data[$key];
            }
            else {
                return false;
            }
        }

        public function set($key, $value) {
            if(!array_key_exists($key, $this->data)) {
                $dirty = true;
            }
            else if($this->data[$key] !== $value) {
                $dirty = true;
            }
            if($dirty) {
                $this->dirty = true;
                $this->data[$key] = $value;
            }
        }

        public function flush() {
            if($this->dirty) {
                $this->persist();
            }
        }
    }


    $cache = new CacheFile("cache");
    var_dump( $cache->get("item") );
    $cache->set("item", 42);
    //$cache->flush();
    var_dump( $cache->get("item") );
?>

Видите вызов flush () в деструкторе? Я действительно не хочу иметь функцию public flush () , потому что она зависит от реализации.

5
задан hakre 14 January 2012 в 11:55
поделиться