@tatarrr95

Как посчитать время выполнения каждой операции в скрипте?

Есть такой скрипт где мне в JSON прилетает массив людей, у каждого из которых несколько номеров и определенные параметры. Для каждого человека и номера и должен сформировать uuid и добавить это в mysql таблицу. Скрипт выполняется очень долго на больших данных. Например первые 15000 номеров залетают в таблицу за минуту, а 75000 залетают 20 минут. Почему так долго и время выполнение експоненциально увеличивается от объема? Возможно ли посчитать время выполнения каждой операции? Как это сделать?

$new_response_client = array();
            $queueBank = array();        

            $clients = $get_data['data'];
            foreach($clients as $client){
                array_push($queueBank, $client);
            }

            foreach($queueBank as $client){

                $flag = flagHandler($get_data['system'], $client['sex']);
                $io = $client['io'];
                $fio = $client['fio'];
                $row_id = $client['row_id'];
                $cnt_days = dpdHandler($client['dpd']);
                $sum = sumHandler($client['sum']);
                $reg_num = $client['reg_num'];
                $originate_params = "origination_caller_id_number=111";
                $smart_dialogs_uid = gen_uuid();

                $new_response_phones = array();

                foreach($client['phones'] as $phone){
                    $phone = phoneHandler($phone);
                    $call_uid = gen_uuid();
                    if(strlen($phone) == 10){
                        $STH = $DBH->prepare("INSERT INTO Queue (Phone, Flag, Io, Fio, Cnt_days, Sum, Reg_num, Originate_params, Client_id, Smart_dialogs_uid, Call_uid) values (:Phone, :Flag, :Io, :Fio, :Cnt_days, :Sum, :Reg_num, :Originate_params, :Client_id, :Smart_dialogs_uid, :Call_uid)");
                        $STH->bindParam(':Phone', $phone);
                        $STH->bindParam(':Flag', $flag);
                        $STH->bindParam(':Io', $io);
                        $STH->bindParam(':Fio', $fio);
                        $STH->bindParam(':Cnt_days', $cnt_days);
                        $STH->bindParam(':Sum', $sum);
                        $STH->bindParam(':Reg_num', $reg_num);
                        $STH->bindParam(':Originate_params', $originate_params);
                        $STH->bindParam(':Client_id', $client['client_id']);
                        $STH->bindParam(':Smart_dialogs_uid', $smart_dialogs_uid);
                        $STH->bindParam(':Call_uid', $call_uid);
                        $STH->execute();
                        $api_status = "Success";
                    }
                    else{
                        $api_status = "Error. Bad count in number.";
                    }
                    array_push($new_response_phones, $phone);
                }
                $new_response_client["row_id"] = $row_id;
                $new_response_client["client_id"] = $client['client_id'];
                $new_response_client["reg_num"] = $reg_num;
                $new_response_client["smart_dialogs_uid"] = $smart_dialogs_uid;
                $new_response_client["phone"] = $new_response_phones;

                $flag = null;
                $io = null;
                $fio = null;
                $cnt_days = null;
                $sum = null;
                $reg_num = null;
                $originate_params = null;
                $smart_dialogs_uid = null;
                array_push($new_response, $new_response_client);
            }
            print_r(json_encode($new_response));
  • Вопрос задан
  • 227 просмотров
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Автор описал типичный ETL-процесс. (Extract-Transform-Load). Такие процессы
1) Не пишут на PHP
2) Используют спец-утилиты импорта (названия разные и зависят от DBMS)
3) Сама DBMS и таблица подготавливается к этому.
- отключаются триггеры и констрейнты
- дропаются индексы.
- используются режимы транзакций максмиально ненагружающие I/O. Тоесть никакого мать ево авто-коммита быть не должно.

В конце триггеры и индексы возвращаются в исходны статус.

Скорость подобного ETL на 80% зависит от этих пунктов что я описал.

И еще раз повторю. На PHP это не делают.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы