#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
и удалите всю функциональность, которая занимает много времени для файла задания.