Сервер не будет обслуживать страницы при загрузке и анализе данных Laravel

#php #laravel #laravel-5 #eloquent

#php #laravel #laravel-5 #красноречивый

Вопрос:

Я разрабатывал модуль биометрического анализа для своей системы. Я достиг своей цели по считыванию необработанных данных из биометрического блока в базу данных. Моя проблема в том, что всякий раз, когда пользователь в моей системе загружает необработанный биометрический файл, сервер не будет обслуживать какие-либо страницы или запросы во время обработки загрузки и чтения. Я хотел бы получить несколько советов и изучить некоторые принципы, позволяющие намного лучше справляться с этим процессом

биометрический файл, который поступает от устройства, выглядит следующим образом

   129   2019-06-23 18:13:10 1   0   0   0
   98   2019-06-23 18:51:46 1   0   0   0
  101   2019-06-23 19:07:29 1   1   0   0
  103   2019-06-23 19:07:37 1   1   0   0
   85   2019-06-23 21:14:01 1   1   0   0
  132   2019-06-23 23:48:54 1   1   0   0
  203   2019-06-24 03:45:44 1   0   0   0
  138   2019-06-24 04:10:06 1   0   0   0
  204   2019-06-24 05:12:57 1   0   0   0
  157   2019-06-24 05:58:07 1   0   0   0
 

файл содержит более 1700 строк, каждая строка является биометрической записью

в моем контроллере есть это, чтобы оценивать каждую строку и сохранять ее в базе данных, объявляется биометрический пакет, чтобы отслеживать загружаемые биометрические данные

 public function store(Request $request)
{
    if(Auth::check()){
        $repeatedRecords =0;
        // evaluate if the file is recieved
        set_time_limit(360);
        if($request->hasFile('BiometricDataFile')){
            $biometricDataLogFile = file($request->BiometricDataFile);
            foreach($biometricDataLogFile as $logFile){
                $BiometricDBRecord = new Biometric;
                $biometricRecord = explode("t", $logFile);
                $BiometricDBRecord->employee_id = $biometricRecord[0];
                $BiometricDBRecord->location = $request->location;
                $BiometricDBRecord->logDate = Carbon::parse($biometricRecord[1]);
                $date = explode(' ', $biometricRecord[1]);
                $BiometricDBRecord->bioDate = $date[0];
                $BiometricDBRecord->bioTime = $date[1];
                $BiometricDBRecord->uploaded_by = Auth::user()->employee_id;
                if(Biometric::where('logDate','=', $biometricRecord[1])->count() <= 0){
                    $BiometricDBRecord->save();
                }else{
                    $repeatedRecords  ;
                }
               
            }

            $newBatch = new BiometricBatch();
            //Setting up data for return to view
            $timeNow = Carbon::now('GMT 8')->toDateTimeString();
            $thirtyMinEarlier = Carbon::now('GMT 8')->subHours(12)->toDateTimeString();
            $biometricDataSaved = Biometric::whereBetween('created_at', [$thirtyMinEarlier, $timeNow])->where('uploaded_by', Auth::user()->employee_id)->get();
            $biometricDataSaved->sortBy('logDate');
            $sortedFirst = $biometricDataSaved->first();
            $sortedLast = $biometricDataSaved->last();
            $newBatch->employee_id = Auth::user()->employee->id;
            $newBatch->batch_upload_date = Carbon::now();
            $newBatch->batch_start_date = $sortedFirst->logDate;
            $newBatch->batch_end_date = $sortedLast->logDate;
            $newBatch->isProcessed = false;
            $newBatch->save();
        }else{ //if the file is not recieved
            return "<h1> File not found </h1>";
        }
            $activityLog = new ActivityLog();
            $activityLog->employee_id = Auth::user()->employee_id;
            $activityLog->action = 'Has uploaded biometric data';
            $activityLog->save();
        
        return view('pages.employeeBiometric')->with('savedLogs', $biometricDataSaved, 'duplicates', $repeatedRecords);
    }else{
        return view('errors.401');
    }
       
}
 

У меня есть внутреннее предчувствие, что я, вероятно, должен сделать это в javascript или ajax, но не знаю, с чего начать и как выполнить.Я хотел бы узнать, как это лучше реализовать, и изучить свои ошибки, спасибо, хорошего дня.

Ответ №1:

Возможно, для некоторых задач, которые занимают слишком много времени, полезно использовать очередь https://laravel.com/docs/8.x/queues

и удалите всю функциональность, которая занимает много времени для файла задания.