2017-02-19 3 views
1

Ich aktualisiere von Laravel 4.1 zu 5.4. Die Warteschlangenmigration ist schwierig.Verwirrt über Laravel 5 Warteschlange zum Senden von E-Mails (Laravel 5.4)

Zuerst bemerkte ich aus iron Route von Routen:

Route::post('queue/receive', function() 
{ 
    return Queue::marshal(); 
}); 

Dann konfiguriert I-Datenbanktreiber und migriert jobs Tabelle:

php artisan queue:table 
php artisan migrate 

I Mail::queue Codes zu den Mailables wie folgt geändert:

Mail::to('[email protected]')->send(new ForgotPassword($user->first_name)); 

ich su um Mails synchron zu versenden (ohne Queue). Dann wechselte ich in die Warteschlange:

Mail::to('[email protected]')->queue(new ForgotPassword($user->first_name)); 

Und schließlich, betreibe ich diesen Befehl von der Konsole:

php artisan queue:listen 

Wenn ein Mail::to Linie ausgeführt wird, wird eine Zeile eingefügt in die Jobs Tisch aber mail ISN‘ t gesendet. Wie kann ich dieses Problem lösen?

Hinweis: ForgotPassword ist eine Mailable Klasse (sollte eine Job Klasse sein?).

+0

Wenn Sie Ihre Logs 'tail -f storage/logs/laravel.log' hinterlassen, sehen Sie irgendwelche Fehler protokolliert? –

+0

'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

+0

Wie lautet der Datentyp für die Spalte "Versuche"? Vielleicht möchten Sie zu etwas Größerem wechseln, wie 'BIGINT' –

Antwort

2

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.

0

Möglicherweise müssen Sie die vorhandene .env-Datei im Projektordner auf Ihrem Computer bearbeiten. Suchen Sie nach der .env-Datei, öffnen Sie sie durch erhabenen Text und bearbeiten Sie sie.

Bearbeiten Sie mit der E-Mail-ID und dem Passwort, mit denen Sie die E-Mails senden werden.

0

Sie können E-Mail mit Laravel Warteschlange finden Sie im Beispiel

Job definieren

public function handle() 
{ 
     $mail_meta_data = $this->send_data; 
     $require_data = $this->require_data; 
     Mail::queue($mail_meta_data['view_name'], ['data'=>$require_data], function($message) use ($mail_meta_data, $require_data) { 
      //$message->from($mail_meta_data['to'], $mail_meta_data['name']); 

      $message->to($mail_meta_data['to'])->subject($mail_meta_data['subject']); 
     }); 
} 

Rufen Sie den Job

dispatch(new SendEmailNotification($mail_meta_data, $require_data)); 

.env

senden
MAIL_DRIVER=smtp 
MAIL_HOST=smtp.sendgrid.net 
MAIL_PORT=587 
MAIL_USERNAME=smtp_username 
MAIL_PASSWORD=smptp_password 
MAIL_ENCRYPTION=tls 

APP_EMAIL=email sent from 
APP_NAME=Name of Email sender 

Hinweis

  1. Stellen Sie sicher, dass Sie über Mail-Konfiguration in Ihrer .env Datei festgelegt haben oder in config/mail.php
  2. Auch php Handwerker Warteschlange: Hören läuft
+0

Mail :: queue oder Mail :: senden in der hande? Wird die Warteschlange nicht ausgeführt? Also ich denke es sollte Mail :: send sein. – horse

+0

ja Mail :: queu, Sie können hier https://laravel.com/docs/5.1/mail#queueing-mail mehr finden – Chintan7027