我正在研究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
都有一个属性{{1 }}),像这样:
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
}
}
内的所有内容(除了此处未显示的html代码),页面将在6.622秒内加载上面的代码,并在0.014秒内加载。
现在我开始质疑我对多层架构的理解:
如果我决定不在我的BLL文件中获取foreach
但是在我的界面中(在我的查询结果中只循环一次而不是两次),那么BLL的目的是什么,如果只返回PDOStatement对象?还有另一种方法可以更有效地返回数据吗?
答案 0 :(得分:2)
有许多优化领域:
lazy loading
中受益,而不是逐个选择数据库行,您可以批量执行。检查this answer,了解如何一次运行多个ID的PDO查询。因此,您只需要运行68个查询而不是1200个