Шаблон синглтона не работает должным образом в CodeIgniter - PullRequest
0 голосов
/ 23 ноября 2011

Я только что запустил небольшую библиотеку, которая должна будет просматривать скриншоты с различных URL и искать указанные строки. Чтобы повысить производительность, я хочу кэшировать содержимое найденной страницы (на время запроса, поэтому в памяти).

У меня сейчас есть это:

class Scraper {

    private $CI;
    private $Cache;


    function __construct() {
        $this->CI =& get_instance();
        $Cache = array();
    }

    public function GetPage($Url) {
        if(!isset($Cache[$Url])) {
            dump("Retrieving");
            $Cache[$Url] =  "DATA";//file_get_contents($Url);
        }
        return $Cache[$Url];
    }

    public function FindString($Url, $String) {
        $Contents = $this->GetPage($Url);
        $Ret = (strpos(strtolower($Contents), strtolower($String)) !== false);
        return $Ret;
    }
}

Примечание: для повышения производительности при отладке я просто помещаю «DATA» в кеш, а не извлекаю страницу.

Теперь у меня есть цикл, который многократно вызывает FindString() с тем же URL.

Я ожидаю, что первый вызов выведет «извлечение» и после этого ничего больше не увидит. На самом деле, я вижу «извлечение» неоднократно.

Я подозреваю, что у меня проблема с областью видимости где-то - либо сама библиотека не является одноэлементной, поэтому каждый вызов FindString достигает уникального экземпляра - либо переменная Cache переинициализируется каким-то образом.

Может кто-нибудь предложить следующие шаги для отладки.

(dump() просто форматирует вещи для меня)

1 Ответ

2 голосов
/ 23 ноября 2011

Вы пропускаете $this во всех местах, где вы обращаетесь к экземпляру переменной $Cache. Код должен быть:

class Scraper {

    private $CI;
    private $Cache;


    function __construct() {
        $this->CI =& get_instance();
        $this->Cache = array();
    }

    public function GetPage($Url) {
        if(!isset($this->Cache[$Url])) {
            dump("Retrieving");
            $this->ache[$Url] =  "DATA";//file_get_contents($Url);
        }
        return $this->Cache[$Url];
    }

    public function FindString($Url, $String) {
        $Contents = $this->GetPage($Url);
        $Ret = (strpos(strtolower($Contents), strtolower($String)) !== false);
        return $Ret;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...