Оптимизация приложения 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));
Это очень затратные функции. Вопрос в том, нужно ли сделать возможно что-то кэшировать, как-то разгрузить это всё или какой нибудь другой метод оптимизации.