问题原因:因为循环调用静态的QueryList,但是每次调用的静态get方法都会创建新的phpQuery对象,导致积压在内存中,内存爆了,就存不了新爬到的内容。
(destruct方法不能回收对象资源,只能去掉不必要的旧html缓存,querylist全都是静态方法,会常驻内存,但是每次调用的phpQuery却又是重新创建一个。)
解决方法,只初始化一个$ql = QueryList::getInstance();
$ql = QueryList::getInstance();
之后
不要用静态方法来调用例如:$ql::html($html); 否则内存爆了还是会出错
都得改成 $ql->html($html);
但是会出现Service: rule not found
所以 还是用的上面的解决方案:
$ql2 = QueryList::getInstance();
foreach ($query as $key => $value) {
$url = $value['link'];
// 定义采集规则
$rules = [
// 采集文章标题
'link' => ['.fr a:eq(2)', 'href', '', function ($content) {
//利用回调函数补全相对链接
$baseUrl = 'http://www.baidu.com';
return $baseUrl . $content;
}],
];
try {
$rt = $ql2->get($url)->rules($rules)->removeHead()->query()->getData();
var_dump($rt->all());
} catch (RequestException $e) {
//print_r($e->getRequest());
echo 'Http Error';
}
}