如何在单个查询中获取Silverstripe中的200多个页面?

时间:2014-11-24 22:30:29

标签: php silverstripe

我们的Silverstripe网站之一是共享主机并且存在重大性能问题。问题似乎是由共享SQL服务器限制可以进行的查询数量引起的。

运行速度最慢的网页可以在Google地图上放置200多页:

$DirectoryItems = DirectoryItem::get()->where("\"Latitude\" IS NOT NULL AND \"Longitude\" IS NOT NULL ")->sort('Title ASC');
$MapItems = new ArrayList();
foreach ($DirectoryItems as $DirectoryItem) {
  $MapItems->push(new ArrayData(array(
      "Latitude" => $DirectoryItem->Latitude,
      "Longitude" => $DirectoryItem->Longitude,
      "MapMarkerURL" => $DirectoryItem->MapMarkerURL,
      "Title" => addslashes($DirectoryItem->Title),
      "Link" => $DirectoryItem->Link()
  )));
}

200多个MapItem中的每一个都会生成它自己的SQL查询,这会使共享SQL服务器过载。

我开始尝试使用单个查询获取相同的信息:

$DirectoryItems = DB::query('SELECT `DirectoryItem`.`Latitude`, `DirectoryItem`.`Longitude`, `DirectoryItem`.`MapMarkerURL`, `SiteTree_Live`.`Title`
FROM `DirectoryItem`, `SiteTree_Live`
WHERE `DirectoryItem`.`ID` = `SiteTree_Live`.`ID` 
AND `DirectoryItem`.`Latitude` IS NOT NULL AND `DirectoryItem`.`Longitude` IS NOT NULL
ORDER BY `SiteTree_Live`.`Title`');

$MapItems = new ArrayList();
foreach ($DirectoryItems as $DirectoryItem) {
  $MapItems->push(new ArrayData(array(
      "Latitude" => $DirectoryItem['Latitude'],
      "Longitude" => $DirectoryItem['Longitude'],
      "MapMarkerURL" => $DirectoryItem['MapMarkerURL'],
      "Title" => addslashes($DirectoryItem['Title']),
      "Link" => ??????
  )));
}

但是当涉及到DirectoryItem的链接时,这会失败。

我考虑在DirectoryItem中添加链接作为数据库字段,但是对于应该是简单的操作,我们开始感到不必要的复杂。

在单个查询中获取200多个DirectoryItem信息的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

你有没有看过缓存?如果您在地图上显示相同的项目,则无需在每次请求时都点击数据库。

如果正确缓存,则需要从服务器上卸下大量负载。

如果你在缓存时仍然遇到问题,你应该考虑一个更好的服务器。

答案 1 :(得分:0)

SiteTree类具有静态功能,该功能在CMS中用于获取特定SiteTreeID的链接。所以你只需要扩展你的SQL查询来获取ID,你可以通过调用以下方式通过ID获取任何页面的链接:

$link = SiteTree::link_shortcode_handler(array('id' => $id), false);

编辑:wmk提出了一种不同的,可能更具前瞻性的使用方式:

$page = SiteTree::get()->byID($id);
if ($page instanceof SiteTree) $link = $page->Link();

未测试; src:http://api.silverstripe.org/master/class-SiteTree.html