Singleton-ish模式在CodeIgniter中无法正常工作

时间:2011-11-23 19:24:08

标签: php codeigniter caching

我刚刚开设了一个小型图书馆,需要屏蔽各种网址并搜索指定的字符串。为了提高性能,我想缓存检索到的页面的内容(在请求期间,因此在内存中)。

我目前得到了这个:

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()

我希望第一次打印出来"检索"之后,别无其他。事实上,我看到"检索"反复。

我怀疑我在某处有一个范围问题 - 图书馆本身不是单身,因此每次调用FindString都会到达一个唯一的实例 - 或{ {1}}变量正在以某种方式重新初始化。

有人可以建议接下来的调试步骤。

Cache只是很好地为我格式化了东西)

1 个答案:

答案 0 :(得分:2)

您访问实例变量$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;
    }
}