Почему выполнение этого кода занимает много времени? - PullRequest
1 голос
/ 08 февраля 2020

Буду признателен за некоторые рекомендации по следующему вопросу. Я ни в коем случае не эксперт в php. Код ниже занимает почти 10 секунд, чтобы выполнить! Есть ли что-то, что я делаю неправильно или плохо?

    $data = [];
    $today = date("Y/m/d");
    $ThisYear = Date('Y'); //get current Year
    $ThisMonth = Date('m'); //get current month
    $Tday = '01'; //first day of month
    $Tmonth = '09'; //September
    if (8 < $ThisMonth && $ThisMonth < 13) {
    $AcYear = $ThisYear; }
    else {
    $AcYear = $ThisYear - 1; // sets start of academic year to be last year
    }
    $AcFullYear = $AcYear.'/'.$Tmonth.'/'.$Tday;

    //find rank in all school
    $students_rank = [];
    $school_id = Student::model()->findByAttributes(['user_master_id' => Yii::app()->user->id])->school_master_id;
    $criteria1 = new CDbCriteria;
         $criteria1->with = array('user');
        $criteria1->condition = "t.school_master_id=:school_master AND user.status ='1'";
        $criteria1->params = array(':school_master' => $school_id);
    $school_students_details = Student::model()->findAll($criteria1);
    foreach ($school_students_details as $key => $value) {
        $student_name = StudentDetails::model()->findByAttributes(['user_master_id' => $value->user_master_id]); //student details with year group
        $criteria2 = new CDbCriteria;
        $criteria2->with = array('homeworkMaster');
        $criteria2->condition = "t.student_id=:student_id AND homeworkMaster.question_type_id<>:question_type_id";
        $criteria2->params = array(':student_id' => $value->user_master_id, ':question_type_id' => 6);
        $HW_assignment_track = HomeworkAssignmentTrack::model()->findAll($criteria2);
        $total_HW = count((array)$HW_assignment_track); 
        $student_score = 0;
        $student_rank = 0;

            $student_total_score = 0;
            $total_HW_marks = 0;
            $under_deadline_HW = 0;

    $criteria3 = new CDbCriteria();
    $criteria3->condition = "student_id =:student_id AND status=:status AND created_at >= '$AcFullYear' AND created_at <= '$today'";
    $criteria3->params = [':student_id' => $value->user_master_id, ':status' => 2];
    $student_completed_HW = HomeworkStudentAnswere::model()->findAll($criteria3);

            $i = 1;
             foreach ($student_completed_HW as $s_c_h_K => $s_c_h_V) {
                if ($s_c_h_V->homework->homework_type == 2) {
                    $total_HW -= 1;

                } elseif ($s_c_h_V->homework->homework_type == 1) {
                    $HW_questions = HomeworkQuestion::model()->findAllByAttributes(['homework_master_id' => $s_c_h_V->homework_id, 'status' => 1]);

                    foreach ($HW_questions as $qKey => $qVal) {
                        if ($qVal->question_type_id ==3) {
                            $total_HW_marks += 2;
                        } else {
                        $total_HW_marks += $qVal->marks;

                        }
                    }
                   $assignment = HomeworkAssignmentTrack::model()->findByAttributes(['id' => $s_c_h_V->assignment_track_id]);
                    $homeworks_within_validate = Assignment::model()->findByPk($assignment->assignment_id);
                    if ($homeworks_within_validate->valid_date === '0' && $homeworks_within_validate->deadline >= date('Y-m-d')) {
                        $total_HW -= 1;
                    }
                    if ($homeworks_within_validate->valid_date === '1' || (($homeworks_within_validate->valid_date === '0') && ($homeworks_within_validate->deadline >= date('Y-m-d', strtotime($s_c_h_V->created_at))) && ($homeworks_within_validate->deadline < date('Y-m-d')))) {
                        if ($s_c_h_V->review_status === '2') {
                            $student_total_score += $s_c_h_V->score;
                        }
                    }

                    $homework_submit = HomeworkCompleteNotification::model()->findByAttributes(['homework_id' => $s_c_h_V->homework_id, 'assignment_track_id' => $s_c_h_V->assignment_track_id, 'student_id' => $value->user_master_id]);
                    if (($homeworks_within_validate->valid_date === '0') && ($homeworks_within_validate->deadline >= date('Y-m-d', strtotime($homework_submit->created_at))) && ($s_c_h_V->review_status === '2')) {
                        $under_deadline_HW += 10;
                    }
                if ($total_HW_marks !=0) {
                    $student_score += round(($student_total_score / $total_HW_marks) * 100);
                } else {
                    $student_score = 0;
                }
                }
                $i += 1;
            }

        //add revision scores to rank score
    $criteria4 = new CDbCriteria();
    $criteria4->condition = "user_id =:user_id AND date_created >= '$AcFullYear' AND date_created <= '$today'";
    $criteria4->params = [':user_id' => $value->user_master_id];
    $revision_score = RevisionScores::model()->findAll($criteria4);

        $sum = 0;

            foreach($revision_score as $item) {
                $sum += $item['score'];
            } //end of adding revision scores


        $students_rank[$key]['student_id'] = $value->user_master_id;
        $students_rank[$key]['year_group'] = $student_name->year_group_id; //added year group to model array
        if ($student_score > 0) {
            $student_rank += round($student_score / $total_HW, 0) + $under_deadline_HW;
            $students_rank[$key]['rank'] = $student_rank + $sum;
        } else {
            $students_rank[$key]['rank'] = $sum;
        }
   }
    $model = $this->multid_sort($students_rank, 'rank');
    $rank_score = round(array_column($model, 'rank', 'student_id')[Yii::app()->user->id],0);

    $year_rank =[];
    $current_st = StudentDetails::model()->findByAttributes(['user_master_id' => Yii::app()->user->id]);
    $current_st_year = $current_st->year_group_id;


    $rank_list = [];
    foreach ($model as $key => $value) {
        $rank_list[] = $value['student_id'];
        if ($value['year_group'] == $current_st_year) {
        $year_rank[] = $value['student_id'];

        }
    }
    $user = Yii::app()->user->id;
    $sch_position = array_search($user,$rank_list);
    $yr_position = array_search($user,$year_rank);
    $final_rank = $sch_position + 1;
    $yr_rank = $yr_position + 1;
    $sch_rank = $final_rank;

    $ends = array('th','st','nd','rd','th','th','th','th','th','th');
    if (($sch_rank %100) >= 11 && ($sch_rank%100) <= 13) {
       $sc_abbreviation = 'th';
       $yr_abbreviation = 'th';
    } else {
       $sc_abbreviation = $ends[$sch_rank % 10];
       $yr_abbreviation = $ends[$yr_rank % 10];
    }

    $models = UserMaster::model()->findByPk(Yii::app()->user->id);
    $year_name = $models->studentDetails->yearGroup->name;

    $data['type'] = 'success';
    $data['score'] = '<div>Ranking Score: '.$rank_score.'</div>';
    $data['yr_rank'] = '<div><i class="fa fa-trophy rank-i"></i><span class="rank-number">' .$yr_rank. '</span><sup class="script-top" id="year_rank_abb">' .$yr_abbreviation. '</sup></div><div id="year_name">In ' .$year_name. '</div>';
    $data['school_rank'] = '<div><i class="fa fa-trophy rank-i"></i><span class="rank-number">' .$sch_rank. '</span><sup class="script-top" id="year_rank_abb">' .$sc_abbreviation. '</sup></div><div id="year_name">In School</div>';
    $data['rank_revise'] ='<div>'.$rank_score.'</div>';
    $data['yr_rank_revise'] = '<span>'.$yr_rank.'</span><sup class="superscript" style="left:0">'.$yr_abbreviation.'</sup>';
    $data['sch_rank_revise'] = '<span>'.$sch_rank.'</span><sup class="superscript" style="left:0">'.$sc_abbreviation.'</sup>';

    $_SESSION['rank'] = $rank_score;
    $_SESSION['accuracy'] = $rank_score;

    echo json_encode($data);
    exit;

Вышеуказанное используется в приложении Yii. Он отлично работает на локальном хосте, но на живом сайте выполняется более 10 секунд. Мы ценим вашу помощь и руководство.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...