Основное различие между синхронным send()
и асинхронным queue()
, что касается вашего объекта ForgotPassword
, заключается в том, что при очереди объект для отправки, он должен быть сериализован для отправки в очередь и неэтериализован, когда работник очереди обрабатывает его.
С send()
работает отлично, но ошибка происходит с queue()
, и мы можем видеть, что в очереди задания обжигают и предпринимается попытка быть обработаны, то, скорее всего, ошибка в сериализации/unserialization.
Ваш класс ForgotPassword
, вероятно, использует признак SerializesModels
, так как команда artisan создает новый объект, способный к пересылке. Этот признак определяет методы __sleep()
и __wakeup()
, которые изменяют работу сериализации и несериализации.
Когда реализован метод __sleep
, PHP будет сериализовать переменные, возвращаемые методом __sleep
. В этом случае реализация, обеспечиваемая признаком SerializesModels
, использует Reflection для прохождения свойств, определенных в классе, чтобы обеспечить особый способ сериализации моделей и коллекций Eloquent.
Из-за этого это означает, что любые переменные в вашем классе ForgotPassword
, которые конкретно не определены как свойство класса, не будут сериализованы и не будут доступны при обработке задания в очереди, а класс неэтериализован , Это наиболее вероятная причина для вашей проблемы. Когда ваша задача предпринимается попытка, ваш несертифицированный экземпляр с электронной почтой не имеет необходимых данных и не работает.
Существует два способа решить эту проблему. Во-первых, если вашему ForgotPassword
на самом деле не нужно сериализовать какие-либо модели, вы можете удалить признак SerializedModels
. Это приведет к удалению определения __sleep()
из класса, а затем все переменные, назначенные классу, а не только те, которые определены на самом деле, будут сериализованы и также будут доступны, если класс неэтериализован.
Второй вариант, который является более подходящим и более явным, заключается в том, чтобы фактически определить необходимые свойства для вашего класса ForgotPassword
.
Если вы определяете свойства своего класса, вы можете оставить свой признак SerializesModels
в своем классе. Однако, если вы на самом деле не сериализуете модели, я бы пошел и убрал его. Если вам это не нужно, нет необходимости в дополнительных расходах на сериализацию.
Когда вы заводите свои журналы 'tail -f storage/logs/laravel.log', вы видите какие-либо ошибки в журнале? –
'Mail :: to' строка не дает ошибок. Но команда 'php artisan queue: listen' приводит к' SQLSTATE [22003]: числовое значение вне диапазона: 1264 Значение вне диапазона для «попыток столбца». – horse
Каков тип данных для столбца 'попытки'? Вы можете захотеть перейти на нечто большее, например 'BIGINT' –