@semechki
Я не фрилансер, просто пишу код для себя.

Как уменьшить нагрузку кода?

Добрый день, сделала что-то похожее на многоуровневую реф. систему.
Но это код ужасно грузит сервер, так как стоит cron на него, мне интересно есть ли возможность его как-то упростить или улучшить?
$mupdatelvl = 1;
$referalQuality = 0;
$referalQualityFree = 0;
$referalQualityFour = 0;
while( $mupdatelvl <= 3 ){
    $query_matrix = mysqli_query($link, "SELECT * FROM `users` WHERE `user_referer` = ".$uID." AND `user_place`=".$mupdatelvl) or die("61 - Ошибка: " . mysqli_error($link));
    $qualityRefrer = mysqli_fetch_array($query_matrix);
    if( mysqli_num_rows($query_matrix) > 0 ){
        $referalQuality++;
    }            
    $mupdatelvl++;
}
if( $referalQuality == 3 ){
	$mupdatelvl = 1;
    while( $mupdatelvl <= 3 ){
        $query_matrix = mysqli_query($link, "SELECT * FROM `users` WHERE `user_referer` = ".$uID." AND `user_place`=".$mupdatelvl) or die("61 - Ошибка: " . mysqli_error($link));
        $qualityRefrer = mysqli_fetch_array($query_matrix);
        $mupdatelvlfree = 1;
            while( $mupdatelvlfree <= 3 ){
                $free_matrix = mysqli_query($link,"SELECT * FROM `users` WHERE `user_referer` = '".$qualityRefrer['user_id']."' AND `user_place`=".$mupdatelvlfree) or die("65 - Ошибка: " . mysqli_error($link));
                $freeRefrer = mysqli_fetch_array($free_matrix);
                if( mysqli_num_rows($free_matrix) > 0 ){
                    $referalQualityFree++;
                }
                $mupdatelvlfree++;
            }
        
        $mupdatelvl++;
    }	
}
if( $referalQualityFree == 9 ){
	$mupdatelvl = 1;
	while( $mupdatelvl <= 3 ){
        $query_matrix = mysqli_query($link, "SELECT * FROM `users` WHERE `user_referer` = ".$uID." AND `user_place`=".$mupdatelvl) or die("61 - Ошибка: " . mysqli_error($link));
        $qualityRefrer = mysqli_fetch_array($query_matrix);
        $mupdatelvlfree = 1;
            while( $mupdatelvlfree <= 3 ){
                $free_matrix = mysqli_query($link,"SELECT * FROM `users` WHERE `user_referer` = '".$qualityRefrer['user_id']."' AND `user_place`=".$mupdatelvlfree) or die("65 - Ошибка: " . mysqli_error($link));
                $freeRefrer = mysqli_fetch_array($free_matrix);
                $mupdatelvlfour = 1;
                while( $mupdatelvlfour <= 3 ){
                    $four_matrix = mysqli_query($link,"SELECT * FROM `users` WHERE `user_referer` = '".$freeRefrer['user_id']."' AND `user_place`=".$mupdatelvlfour) or die("74 - Ошибка: " . mysqli_error($link));
                    $fourRefrer = mysqli_fetch_array($four_matrix);
                    if( mysqli_num_rows($four_matrix) > 0 ){
                        $referalQualityFour++;
                    }else{
                        break;
                    }
                    $mupdatelvlfour++;
                }
	                
                $mupdatelvlfree++;
            }
        
        $mupdatelvl++;
    }
}

$uID - берется напрямую из таблицы пользователей, следовательно просчитывает всех пользователей с определённым статусом, таких около 250-ти человек
Коротко о этом ужасе - когда у пользователя набирается 3 человека он поднимает уровень рефералки, то есть получает больший процент
Потом проверяются как раз таки эти три первых человека и у каждого так же должно быть по 3 человека, тогда начальный пользователь получает следующий уровень.
И потом получается проверяется 9 человек и у каждого должно быть по три - начальный пользователь получает последний уровень рефералки.
Так вот... Сложно я объясняю, но вот так получилось только :)
Заранее спасибо, даже за то что попытаетесь понять этот текст
  • Вопрос задан
  • 91 просмотр
Пригласить эксперта
Ответы на вопрос 3
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
либо nested sets структура(проще всего) либо триггер срабатывающий на изменение кол-ва рефералов и вызывающий обновление у записей-родителей
Ответ написан
Комментировать
@rPman
Код ужасен, не разбираюсь в нем да и не охота.
Вы фактически загружаете все данные в php память, но не одним запросом а огромным количеством (на каждого человека по несколько да?) что абсурдно.

Правильно либо загрузить все одним запросом в память и вертеть данными как вам хочется, либо что лучше - сделать все необходимые операции исключительно sql кодом.

Ну и для начала, тригером, как только появляется у пользователя реферер - обновляйте поле referers_count в таблице пользователя, тогда вы можете быстро и эффективно делать запрос по пользователям с нужным количеством рефереров, так же вместо того чтобы делать по крону вычисления, считайте что там вам нужно считать по реферам в момент запроса данных, сохраняйте в кеш таблице на дату, при этом формула должна как то учитывать что предыдущий подсчет учел данные (например транзакции имеют пометку времени, значит запрос должен брать только те транзакции, время которых новее предыдущего запроса)...
Ответ написан
По моему, надо над структурой БД подумать. С вашей задачей я не сталкивался, но первое что приходит в голову (как уже выше сказали) NestedSets - это позволит делать быстрые выборки любой части дерева.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 03:52
1000 руб./за проект
19 апр. 2024, в 03:01
1000 руб./за проект
18 апр. 2024, в 21:56
2000 руб./за проект