搜索关键字的XML源

时间:2010-08-24 13:33:51

标签: php xml keyword

所有

我正在建立一个网站,它将从大约35种不同的RSS源收集新闻故事,并以数组形式存储。我正在使用foreach()循环来搜索标题和描述,看它是否包含大约40个关键字中的一个,每个文章都使用substr()。如果搜索成功,该文章将存储在数据库中,最终将显示在网站上。

该脚本每30分钟运行一次。麻烦的是,它需要1-3分钟,具体取决于返回的故事数量。不是'糟糕',但在托管env的分片上,我可以看到这会导致很多问题,特别是随着网站的增长和更多的Feed /关键字的添加。

有什么方法可以优化关键字的“搜索”,这样我就可以加快“索引”的速度?

谢谢!

2 个答案:

答案 0 :(得分:2)

35-40 RSS源是一个脚本一次处理和解析所有请求的很多请求。您的瓶颈很可能是请求,而不是解析。你应该分开关注点。有一个脚本每分钟左右一次请求一个RSS源,并在本地存储结果。然后另一个脚本应该每15-30分钟解析并保存/删除临时结果。

答案 1 :(得分:2)

您可以使用XPath直接搜索XML ...类似于:

$dom = new DomDocument();
$dom->loadXml($feedXml);
$xpath = new DomXpath($dom);

$query = '//item[contains(title, "foo")] | //item[contains(description, "foo")]';
$matchingNodes = $xpath->query($query);

然后,$matchingNodes将是所有匹配的item节点的DomNodeList。然后你可以将它们保存在数据库中......

所以要根据您的真实世界示例进行调整,您可以构建查询以一次性完成所有搜索:

$query = array();
foreach($keywords as $keyword) {
    $query[] = '//item[contains(title, "'.$keyword.'")]';
    $query[] = '//item[contains(description, "'.$keyword.'")]';
}
$query = implode('|', $query);

或者只是重新查询每个关键字......就个人而言,我构建了一个巨大的查询,从那以后所有的匹配都是在编译的C代码中完成的(因此应该比在php中循环并聚合更有效)结果那里)...