Я думаю, что самый простой способ добиться чего-то подобного - запустить запрос каждую минуту или около того, проверяя обновленные столбцы. Альтернативой было бы заставить вашего демона запустить какой-то сервер, который получает pinged с помощью модельного события.
Если вам нужно только отслеживать однопользовательский адрес электронной почты, это достаточно просто - User::find($id);
, затем sleep(60)
. Если вам нужно контролировать более одного пользователя, это становится немного сложнее.
Если ваша модель использует временные метки (created_at и updated_at), можно запросить только те модели, которые были обновлены в последнее время. Предположим, вы хотите повторно запросить базу данных каждые 60 секунд - мы хотим запросить все пользовательские модели, у которых есть update_at больше, чем 60 секунд назад.
Я буду использовать класс Carbon, который является расширением DateTime, включенным в Laravel, но вы также можете создать обычный объект DateTime или строку datetime вручную.
$dt = Carbon\Carbon::now()->subSeconds(60);
$users = User::where('updated_at', '>=', $dt)
->get();
foreach ($users as $user) {
// do something with users that have been updated
}
sleep(60);
Вы также можете заменить get()
с lists('email')
, если вы хотите только плоский массив писем обновленных пользователей.
Также могут быть более эффективные способы, чем использование sleep(60)
, возможно, с использованием класса процессов Symfony, но я не буду вдаваться в это.
Если сценарий 2 оставлен включенным, то в настоящее время он не будет получать изменения, сделанные сценарием 1. Это происходит потому, что 'User :: find()' выполняется за пределами цикла и не читается снова. Скопируйте это внутри цикла (вам это нужно, где оно также), а затем 'sleep (5);' поэтому вы не носите свою базу данных. Тогда это должно сработать. – halfer
Итак, вам нужно снова начать занятия? Спасибо, это то, что я искал. Не был уверен, что это было необходимо. – Martijn
Вы можете использовать блокировку. http://laravel.com/docs/queries#pessimistic-locking – Anam