我刚刚开设了一个小型图书馆,需要屏蔽各种网址并搜索指定的字符串。为了提高性能,我想缓存检索到的页面的内容(在请求期间,因此在内存中)。
我目前得到了这个:
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
只是很好地为我格式化了东西)
答案 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;
}
}