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

时间:2017-11-14 13:09:40

标签: php optimization

我正在研究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对象?还有另一种方法可以更有效地返回数据吗?

1 个答案:

答案 0 :(得分:2)

有许多优化领域:

  1. 技术优化:每次运行查询时,都不应连接到数据库,而应仅连接一次,然后在整个应用程序中使用此连接。我写了一篇article on the common errors of Database wrappers,你可能会觉得阅读很有意思,尤其是数据库连接的部分。
  2. 架构优化。您似乎可以从lazy loading中受益,而不是逐个选择数据库行,您可以批量执行。检查this answer,了解如何一次运行多个ID的PDO查询。因此,您只需要运行68个查询而不是1200个
  3. 数据库优化。确保所涉及的所有查询都快速运行。