带PDO查询的多层体系结构中的优化问题



我已经在一个PHP项目上工作了大约6个月,我使用的是多层架构(数据访问层、业务逻辑层…)

我网站的一个页面加载时间很长,所以我调查了一下,发现这是一个BLL文件中的函数,需要更长的时间来处理。

下面是我的DAL(这里称为DAL_Releve)文件中的一个函数示例:

public static function getReleveByAffectationID($id){
$conn = MgtConnexion::getConnexion();
$sql = "SELECT *"
. "FROM releve "
. "WHERE Affectation_ID = :id "
. "AND Date_Releve >= :date ;";
$req = $conn->prepare($sql);
$req->bindValue(":id", $id);
$req->bindValue(":date", $_SESSION["year"]-1 ."-01-01");
$req->execute();
MgtConnexion::closeConnexion($conn);
return $req;
}

下面是我的BLL(这里称为MgtReleve)文件中的一个函数示例:

public static function getReleveByAffectationID($id){
$req = DAL_Releve::getReleveByAffectationID($id);
$releveArray = array();
while($row = $req->fetch(PDO::FETCH_ASSOC)){
$releveArray[] = new releve($row);
}
return $releveArray;
}

正如您所看到的,我从DAL返回PDOStatement对象$req,然后在BLL中获取它。

我的问题是:在我的接口文件中,我循环遍历一个Affectation数组,每个数组都有Releves(所以每个Releves都有一个属性Affectation_ID),如下所示:

$lesAff = MgtAffectation::getAllAffectation(); 
//This doesn't return an array of objects but just an Array of arrays like : $array[<number>]["key"] = value;
foreach ($lesAff as $affect){
$lesReleves = MgtReleve::getReleveByAffectationID($affect["Affectation_ID"]);
foreach ($lesReleves as $rel){
//DO STUFF HERE
}
}

仅供参考:使用上面的代码,页面在6.622秒内加载,如果我删除第一个foreach中的所有内容,则在0.014秒内加载(此处未显示的html代码除外)。

现在我开始质疑我对多层体系结构的理解:

如果我决定不在我的BLL文件中获取$req,而是在我的接口中获取(在查询结果中只循环一次,而不是两次),那么如果只返回PDOStatement对象,BLL的目的是什么?有没有其他方法可以更高效地返回数据?

有许多优化领域:

  1. 技术优化:与其每次运行查询都连接到数据库,不如只连接一次,然后在整个应用程序中使用此连接。我写了一篇关于数据库包装器常见错误的文章,你可能会觉得读起来很有趣,尤其是关于数据库连接的部分
  2. 架构优化lazy loading似乎可以让您受益,因为您可以批量选择数据库行,而不是一个接一个地选择数据库行。关于如何同时使用多个ID运行PDO查询,请查看此答案。因此,只需要运行68个查询,而不是1200个
  3. 数据库优化。请确保所有涉及的查询都在快速运行

最新更新