1.如前所述,深度网络扫描器的核心组件是基本的 Hoover 类。本示例中介绍的基本过程是扫描目标网站并收集所有 HREF 属性。为此,我们定义了 Application\Web\Deep 类。 我们添加一个代表 DNS 域的属性:
namespace Application\Web;
class Deep
{
protected $domain;
2.接下来,我们定义了一个方法,该方法将对扫描列表中代表的每个网站的标签进行抓取。为了防止扫描器搜索整个万维网(WWW),我们将扫描范围限制在目标域。之所以加入了yield from ,是因为我们需要输出由 Hoover::getTags() 产生的整个数组。yield from 语法允许我们将数组视为一个子生成器:
public function scan($url, $tag)
{
$vac = new Hoover();
$scan = $vac->getAttribute($url, 'href',
$this->getDomain($url));
$result = array();
foreach ($scan as $subSite) {
yield from $vac->getTags($subSite, $tag);
}
return count($scan);
}
使用 yield from 可以将 scan() 方法变成一个PHP 7的委托生成器。通常情况下,你会倾向于将扫描的结果存储到一个数组中。问题是,在这种情况下,检索到的信息量可能是巨大的。因此,为了节省内存和立即产生结果,最好的方式是使用 yield。否则,就会有一个漫长的等待,这很可能会出现内存不足的错误。