Der Hauptunterschied zwischen dem synchronen send()
und dem asynchronen queue()
, soweit Ihr Objekt ForgotPassword
betrifft, ist, dass, wenn Sie in die Warteschlange Das zu sendende Objekt muss serialisiert werden, damit es an die Warteschlange gesendet werden kann, und unserialisiert werden, wenn der Warteschlangen-Worker es verarbeitet.
Seit send()
funktioniert gut, aber ein Fehler auftritt, mit queue()
, und wir können sehen, dass der Auftrag in der Warteschlange ausgelöst wird und versucht, die verarbeitet wird, gibt es höchstwahrscheinlich einen Fehler bei der Serialisierung/Deserialisierung.
Ihre Klasse ForgotPassword
verwendet wahrscheinlich die Eigenschaft SerializesModels
, da der Befehl "artisan" ein neues versendbares Objekt generiert. Dieses Merkmal definiert die Methoden __sleep()
und __wakeup()
, die die Funktionsweise der Serialisierung und Deserialisierung modifizieren. Wenn die Methode __sleep
implementiert ist, wird PHP nur die Variablen serialisieren, die von der __sleep
-Methode zurückgegeben werden. In diesem Fall verwendet die Implementierung, die von der Eigenschaft SerializesModels
bereitgestellt wird, Reflection, um die in der Klasse definierten Eigenschaften durchzugehen, um eine spezielle Möglichkeit zum Serialisieren von Eloquent-Modellen und -Sammlungen bereitzustellen. Daher bedeutet dies, dass alle Variablen in Ihrer ForgotPassword
-Klasse, die nicht speziell als Eigenschaft für die Klasse definiert sind, nicht serialisiert werden, und sie sind nicht verfügbar, wenn der in der Warteschlange befindliche Job verarbeitet und die Klasse unserialisiert wird . Dies ist der wahrscheinlichste Grund für Ihr Problem. Wenn Ihr Auftrag versucht wird, verfügt Ihre unserialisierte sendbare Instanz nicht über die erforderlichen Daten und schlägt fehl.
Es gibt zwei Möglichkeiten, dies zu beheben. Erstens: Wenn Ihr Modell ForgotPassword
keine Modelle serialisieren muss, können Sie das Merkmal SerializedModels
entfernen. Dadurch wird die __sleep()
Definition aus der Klasse entfernt, und dann werden alle der Klasse zugewiesenen Variablen und nicht nur die tatsächlich definierten Variablen serialisiert und sind auch verfügbar, wenn die Klasse unserialisiert wird.
Die zweite Option, die angemessener und expliziter ist, besteht darin, die Eigenschaften zu definieren, die Sie für Ihre Klasse ForgotPassword
benötigen.
Wenn Sie die Eigenschaften für Ihre Klasse definieren, können Sie das Merkmal SerializesModels
in Ihrer Klasse belassen. Wenn Sie jedoch keine Modelle serialisieren, würde ich sie entfernen. Kein zusätzlicher Serialisierungsaufwand, wenn Sie ihn nicht benötigen.
Wenn Sie Ihre Logs 'tail -f storage/logs/laravel.log' hinterlassen, sehen Sie irgendwelche Fehler protokolliert? –
'Mail :: to' Zeile gibt keinen Fehler. Der Befehl 'php artisan queue: listen' führt jedoch zu 'SQLSTATE [22003]: Numerischer Wert außerhalb des Bereichs: 1264 Außerhalb des Bereichs für die Spalte' Versuche '. – horse
Wie lautet der Datentyp für die Spalte "Versuche"? Vielleicht möchten Sie zu etwas Größerem wechseln, wie 'BIGINT' –