Основное различие между синхронным send()
и асинхронным queue()
, что касается вашего объекта ForgotPassword
, заключается в том, что когда вы ставите объект в очередь для отправки, он должен быть сериализован для отправки в очередь и десериализован, когда обработчик очереди его обрабатывает. .
Поскольку send()
работает нормально, но с queue()
возникает ошибка, и мы видим, что задание в очереди запущено и пытается быть обработано, скорее всего, есть ошибка в сериализации/десериализации.
Ваш класс ForgotPassword
, вероятно, использует трейт SerializesModels
, так как именно так команда artisan создает новый почтовый объект. Этот трейт определяет __sleep()
и __wakeup()
, которые изменяют работу сериализации и десериализации.
Когда реализован метод __sleep
, PHP будет сериализовать только те переменные, которые возвращаются методом __sleep
. В этом случае реализация, предоставляемая трейтом SerializesModels
, использует Reflection для просмотра свойств, определенных в классе, чтобы обеспечить особый способ сериализации моделей и коллекций Eloquent.
Из-за этого это означает, что любые переменные в вашем классе ForgotPassword
, которые не определены специально как свойство класса, не будут сериализованы и не будут доступны при обработке задания в очереди и десериализации класса. Это наиболее вероятная причина вашей проблемы. Когда ваша работа выполняется, ваш несериализованный почтовый экземпляр не имеет необходимых данных и дает сбой.
Есть два способа решить эту проблему. Во-первых, если вашему ForgotPassword
на самом деле не нужно сериализовать какие-либо модели, вы можете удалить трейт SerializedModels
. Это удалит определение __sleep()
из класса, а затем все переменные, присвоенные классу, а не только те, которые фактически определены, будут сериализованы, а также будут доступны, когда класс не сериализован.
Второй вариант, который является более подходящим и более явным, заключается в том, чтобы фактически определить свойства, которые вам нужны, в вашем классе ForgotPassword
.
Если вы определяете свойства в своем классе, вы можете оставить черту SerializesModels
в своем классе. Однако, если вы на самом деле не сериализуете модели, я бы удалил его. Нет необходимости в дополнительных накладных расходах на сериализацию, если они вам не нужны.
person
patricus
schedule
26.02.2017
tail -f storage/logs/laravel.log
, видите ли вы какие-либо зарегистрированные ошибки? - person Daniel Verem   schedule 21.02.2017Mail::to
строка не выдает ошибку. Но командаphp artisan queue:listen
приводит кSQLSTATE[22003]: Numeric value out of range: 1264 Out of range value for column 'attempts'
. - person horse   schedule 21.02.2017attempts
? Вы можете изменить его на что-то большее, напримерBIGINT
. - person Daniel Verem   schedule 21.02.2017Jobs
. - person horse   schedule 21.02.2017attempts
, т.е.tinyInteger
. Один из способов решить эту проблему — добавитьpublic $tries = 5;
или другое число к вашему классу работы. @лошадь - person Daniel Verem   schedule 21.02.2017ForgotPassword
должно бытьMailable
. Ваша очередь пытается отправить почту, но по какой-то причине это не удается. Можете ли вы опубликовать свойForgotPassword
класс? Кроме того, нет ли других записей в журнале, которые могли бы объяснить, почему задание не выполняется? - person patricus   schedule 24.02.2017