Оптимизация приложения php

Имеется собственная разработка СРМ-системы для компании. И дело в том, что в приложении имеется база работников. Каждый из них делает расход и приход средств. И в самом приложении нужно считать эти данные, т.е сколько работник сделал прибыли за день, неделю, месяц и тд. Дальше на основе этих данных можно сделать расчет зарплаты и тд. Задача в том, как максимально оптимизировать приложение, так как выполняются сложные запросы в базу данных, и это занимает кучу времени. Вот примеры некоторых запросов в бд Отчет по каждому пользователю:

function getDiagramUserData($user_tag, $start_date, $end_date){
    $mysqli = new \mysqli("localhost", "newuser", "password", "crm");
    $mysqli->set_charset("utf8mb4");
    $template = [];
    $start = new Datetime($start_date);
    $end = new Datetime($end_date);
    $end = $end->modify( '+1 day' );
    $interval = new DateInterval('P1D');
    $daterange = new DatePeriod($start, $interval ,$end);

    foreach($daterange as $date){
        $template[$date->format("d.m")] = [0, 0, 0];
    }
    $stats = $mysqli->query("select * from `stats` where who='{$user_tag}' and DATE_FORMAT(time, '%Y-%m-%d')>=str_to_date('{$start_date}', '%Y-%m-%d') and DATE_FORMAT(time, '%Y-%m-%d')<=str_to_date('{$end_date}', '%Y-%m-%d')");

    if($stats->num_rows > 0 ){
        $stats = $stats->fetch_all();

        foreach($stats as $key=>$stat) {
            $date = date(strtotime($stat[9]));
            $dt = date("d", $date).".".date("m", $date);
            $template[$dt][0] +=$stat[2];
            $template[$dt][0] +=$stat[3];
            $template[$dt][0] +=$stat[4];
            $template[$dt][0] +=$stat[5];
            $template[$dt][0] +=$stat[6];
            $template[$dt][0] +=$stat[2] / 100;
            $template[$dt][1] +=$stat[7];
            $template[$dt][2] =$stat[8]+$template[$dt][1]-$template[$dt][0];

        }
    }

    return json_encode($template);

}

Отчет статистики всей компании

$mysqli = new \mysqli("localhost", "newuser","password","crm");
$mysqli->set_charset('utf-8');
function getMonthlyReport($mysqli, $start_date, $end_date, $monthly = false)
{
    $report = [];
    $sql = "select sum(amount) as fund from `finances` where operation = '3' and  DATE_FORMAT(date, '%Y-%m-%d')>=str_to_date('{$start_date}', '%Y-%m-%d') and DATE_FORMAT(date, '%Y-%m-%d')<=str_to_date('{$end_date}', '%Y-%m-%d');
                                select sum(amount) as statica from `finances` where operation = '0' and  DATE_FORMAT(date, '%Y-%m-%d')>=str_to_date('{$start_date}', '%Y-%m-%d') and DATE_FORMAT(date, '%Y-%m-%d')<=str_to_date('{$end_date}', '%Y-%m-%d');
                        
                                select SUM(spend) as spend, SUM(cards+accounts+apps+dolphin) as money,SUM(coming) as coming,SUM(cards) as cards,SUM(accounts) as accounts,SUM(apps) as apps,SUM(dolphin) as dolphin from `stats` where  DATE_FORMAT(time , '%Y-%m-%d')>=str_to_date('{$start_date}', '%Y-%m-%d') and DATE_FORMAT(time , '%Y-%m-%d')<=str_to_date('{$end_date}', '%Y-%m-%d')";
    $result = $mysqli->multi_query($sql);
    $res = [];
    do {
        if ($result = $mysqli->store_result()) {
            $response = $result->fetch_assoc();
            $res = array_merge($response, $res);
            $result->free();
        }

    } while ($mysqli->next_result());
    foreach ($res as $key => $re) {
        $report[$key] = (float)$res[$key];
    }
    $wages = getWages($start_date, $end_date, $mysqli);
    $report['minus'] = 0;
    if ($start_date == '2022-04-01') {

        $report['ekv'] = ($report['spend'] * 0) / 100;

        $report['wages'] = $wages['TOTAL'] - 600 - 250;
    }else{
        $report['wages'] = $wages['TOTAL'];
        $report['ekv'] = ($report['spend'] * 3) / 100;


    }
    $report['out'] = $report['money']+$report['spend']+$report['statica']+$report['ekv']+$report['wages'];
    $report['profit'] = ($report['coming']-$report['out'])+$report['fund'];
    $report['buyrs'] = ($report['coming']-($report['money']+$report['spend']+$report['ekv']));
    if($monthly){
        $dateTime = new DateTime(date('Y-m-d H:i:s', strtotime($start_date)));
        $lastMonth = $dateTime->modify('-' . $dateTime->format('d') . ' days')->format('Y-m-d');
        $start_date = date("Y-m-1 H:i:s", strtotime($lastMonth));
        $end_date = date("Y-m-t H:i:s", strtotime($lastMonth));
        $lastMonth = getMonthlyReport($mysqli, $start_date, $end_date);
        if($lastMonth['profit'] < 0){

                $report['minus'] = $lastMonth['profit'] + 576 + 531.95+250+300;

        }
    }
    $report['minusable'] = $report['profit'] + $report['minus'];
    return $report;
}

echo json_encode(getMonthlyReport($mysqli,$start_date, $end_date, true));

Это очень затратные функции. Вопрос в том, нужно ли сделать возможно что-то кэшировать, как-то разгрузить это всё или какой нибудь другой метод оптимизации.


Ответы (0 шт):