#laravel #laravel-5 #laravel-5.7
#laravel #laravel-5 #laravel-5.7
Вопрос:
Вот упрощенная версия того, что происходит:
-
Пользователь заполняет форму.
-
При сохранении формы идентификатор строки сохраняется в сеансе.
-
Затем пользователь входит в систему.
-
Событие входа пользователя в систему перехватывается, и правильная строка (идентификатор, взятый из сеанса) затем обновляется идентификатором пользователя.
Теперь, если пользователь выполняет только шаги 1 и 2, а затем прекращает процесс, потому что не хочет входить в систему, в базе данных остаются строки данных, не приписанные пользователю.
Мне нужно удалить эти строки.
Какой был бы наилучший способ добиться этого?
-
Есть ли способ выполнить транзакцию базы данных, которая выполняется по запросам, чтобы ее можно было запускать до входа в систему и фиксировать после входа в систему?
-
Был бы лучшим сценарий очистки, запускаемый так часто, который не находил бы строк, приписываемых пользователю, и удалял бы их?
Или есть другой способ?
Комментарии:
1. Лично я бы выбрал решение «сценарий очистки». Просто напишите облегченную команду и выполняйте if каждые 30 минут / 1 час, добавив ее в ядро вашей консоли.
2. вы можете создать идентификатор по умолчанию для таких ситуаций. и прикрепите это к каждой строке, в которой отсутствует переменная в сеансе. таким образом, вы можете удалить каждую строку с этим идентификатором.
3. Есть ли какая-либо причина, по которой вы не можете сохранить все данные формы в сеансе между шагом 1 и шагом 2?
4. @panthro Да, не рекомендуется хранить слишком много данных в сеансе. Тем не менее, вы можете сохранить свои данные во временном файле (взгляните на метод sys_get_temp_dir ), а затем сохранить путь к вашему файлу в сеансе.
5. Что-то, что следует учитывать, хотя я сомневаюсь, что это часто произойдет, но если сценарий будет выполняться между пользователем, отправляющим форму, и входом в систему, не приведет ли это к удалению их строки? Возможно, вы захотите запускать его каждый час и удалять только 60 минут назад, чтобы попытаться предотвратить это.
Ответ №1:
Я бы создал скрипт очистки с помощью планировщика, см. Основную идею ниже:
// appConsoleKernel.php
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
// Query all records that havent changed in an x-amount of time
// and remove them.
})->everyDay();
}
Затем вы просто добавляете следующий CRON-скрипт на свой сервер:
* * * * * cd /path-to-your-project amp;amp; php artisan schedule:run >> /dev/null 2>amp;1
И помощник Artisan будет вызывать ваш планировщик каждую минуту и запускать каждую задачу в зависимости от ее интервала.
Поскольку вы не можете сказать, вернется ли пользователь когда-нибудь, включая тот факт, что сеанс Laravel, скорее всего, очистится очень скоро (время жизни по умолчанию составляет 120 минут, я полагаю), не будет никакого другого триггера для удаления определенной записи из вашей базы данных.