Doubt in logic for table of comparisons between plans - It is giving Timeout

Asked

Viewed 23 times

0

I have the following table on my website, and today, it is static (not upgradable by Cmss). It has more lines than this image, but I only took a piece to illustrate.

inserir a descrição da imagem aqui

Today, in my database, I have these 3 plans (ACO, ACO FIT and ACO Modular) registered in a table called "system_plans". Each plan has ONE product registered in "system_product" and interconnected by a table called "system_plano_product". Inside each product, there are the modules that, in the image above, are illustrated aligned in the left column. These modules are registered in a table called "system_module" and interconnected in the product through a table called "system_product_module".

I need to assemble this image table by consulting the information in the bank. I managed, but due to the high number of consultations, in 80% of the times it gives TIMEOUT.

So I think there’s something wrong with the logic I’ve built. I’d like tips on how to proceed!

$divTabela = "";
$listaHead01 = "";
$listaHead02 = "";
$listaModulo = "";
$listaFoot = "";

/ * Traz os planos pra montar a tabela
$objPlano = new Plano();
$objPlano->plaAtivo = "S";
$objPlano->plaExcluido = "N";
$resultadoPlano = $objPlano->load(false, "plaValor DESC");

if(!empty($resultadoPlano)){

    // * Inicia os objetos
    $objPlanoProduto = new PlanoProduto();
    $objProdutoModulo = new ProdutoModulo();

    $objModulo = new Modulo();
    $objModulo->modAtivo = "S";
    $objModulo->modExcluido = "N";

    $arrayProdutoId = array();

    // * Loop de planos
    foreach($resultadoPlano as $plano){

        $valorPlano = (!empty($plano['plaValor'])) ? "A partir de<br><span>R$".number_format($plano['plaValor'],2,",",".")."</span> mensais<br><small>+ Taxa de ativação da licença e tempo mínimo de contrato: 12 meses</small>" : "Consulte";

        // * Headings
        $listaHead01 .= "<th width=\"20%\">".$plano['plaTitulo']."</th>";
        $listaHead02 .= "<th>".$valorPlano."</th>";

        // * Footers
        $listaFoot .= "<td><a class=\"btn-arq\" href=\"/produto/".$plano['plaAlias']."\">Mais detalhes</a></td>";

        // * Precisamos saber agora qual ícone irá em cada TD
        // * Para isso, traremos primeiro o produto do plano $i
        // * Com o produto definido, podemos saber quais módulos cada produto tem disponível
        $objPlanoProduto->plaId = $plano['plaId'];
        $resultadoPlanoProduto = $objPlanoProduto->load();

        if(!empty($resultadoPlanoProduto)){
            $arrayProdutoId[] = $resultadoPlanoProduto[0]['proId'];
        }

    }

    // * Traz a lista de módulos
    $resultadoModulo = $objModulo->load();

    if(!empty($resultadoModulo)){

        foreach($resultadoModulo as $modulo){

            // * Inicia as variáveis
            $tdPlano = "";

            // * Tbody
            // * Pra cada plano, cria uma TD
            for($i = 0; $i < count($resultadoPlano); $i++){

                $iconeCheck = "";

                // * Agora, trazemos os módulos do produto
                $objProdutoModulo->proId = $arrayProdutoId[$i];
                $objProdutoModulo->modId = $modulo['modId'];
                $resultadoProdutoModulo = $objProdutoModulo->load(true);

                if(!empty($resultadoProdutoModulo)){

                    // * Verifica se o produto é modular
                    if($resultadoPlano[$i]['plaValor'] > 0){
                        $iconeCheck = "<i class=\"fa fa-check\"></i>";
                    }
                    else{
                        $iconeCheck = "<i data-toggle=\"tooltip\" title=\"Item opcional. Consulte adição.\" class=\"fa fa-question\"></i>";
                    }
                }

                // * Monta no template
                $tdPlano .= "<td>".$iconeCheck."</td>";

            }

            $listaModulo .= "
            <tr>
                <td>".$modulo['modTitulo']."</td>
                ".$tdPlano."
            </tr>";
        }

    }

    $divTabela = "
    <table class=\"tabelaPreco table table-bordered table-striped\">
        <thead>
            <tr>
                <th width=\"20%\" style=\"background:#f3f3f3\"></th>
                ".$listaHead01."
            </tr>
            <tr>
                <th style=\"background:#f3f3f3\"></th>
                ".$listaHead02."
            </tr>
        </thead>
        <tbody>
            ".$listaModulo."
        </tbody>
        <tfoot>
            <tr>
                <td></td>
                ".$listaFoot."
            </tr>
        </tfoot>
    </table>";
}
  • Ever tried to put logs in the middle of the code to know the point that takes the most time?

  • @Pagotti the query that is inside the for: $resultsProdutModule = $objProductModule->load(true); This takes longer. But it takes time for the amount of times it is performed, not for its construction itself.

  • This is bad even because they are two nested loops. In this case I don’t see how to optimize the code pq the bank time is much longer. I think the best is to see if you can optimize the consultation in the bank to do once or at least take from inside the last loop.

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.