Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Push to Laravel Queue von außerhalb von Laravel (NodeJS)

Beachten Sie zunächst, dass dies das Format der Jobs in der datenbankbasierten Warteschlange in Laravel 5.3 ist. Neuere Versionen von Laravel enthalten Änderungen.

Die Payload-Spalte sollte ein JSON-Objekt im folgenden Format enthalten. Der Job (...\\[email protected] ) kann in diesem Szenario hartcodiert werden. Ich glaube, der Schlüssel commandName dient nur zu Anzeigezwecken. Die Befehlstaste ist jedoch der schwierigere Teil, sie sollte ein gültiges Objekt sein, das unserialize() unterstützt. Es sieht so aus, als wären Pakete für diesen Zweck auf npm verfügbar, eine schnelle Suche ergab php-serialization.

{
    "job": "Illuminate\\Queue\\[email protected]",
    "data": {
        "commandName": "App\\Jobs\\MyJobClass",
        "command": "O:19:\"App\\Jobs\\MyJobClass\"... /* stuff */"
    }
}

Die von Ihnen bereitgestellte JSON-Nutzlast ergibt das folgende Objekt. Sowohl der Auftrags- als auch der Datenschlüssel sind wichtig.

{
  "job": "Illuminate\\Broadcasting\\BroadcastEvent",
  "data": {
    "event": "O:28:\"App\\Events\\NotificationEvent\":5:{s:7:\"\u0000*\u0000name\";s:12:\"notification\";s:4:\"data\";a:4:{s:4:\"testkey\";s:14:\"testval\";s:9:\"timestamp\";s:19:\"2017-02-24 11:07:48\";s:5:\"event\";s:12:\"notification\";s:5:\"class\";s:28:\"App\\Events\\NotificationEvent\";}s:10:\"\u0000*\u0000channel\";N;s:7:\"\u0000*\u0000user\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":2:{s:5:\"class\";s:8:\"App\\User\";s:2:\"id\";i:2;}s:6:\"socket\";N;}"
  },
  "id": "XuUKRTf8CTSdzaVgp2gRcvmxQqLcpBUG",
  "attempts": 1
}

Der problematische Teil, nehme ich an, ist das serialisierte Objekt. Umformatiert in einer Weise, die einfacher zu lesen ist (aber es völlig kaputt macht) ...

O:28:"App\Events\NotificationEvent":5:{
    // protected $name = 'notification'
    s:7:" * name";s:12:"notification";

    // public $data = array(...)
    s:4:"data";a:4:{
        // 'testkey => 'testval'
        s:4:"testkey";s:14:"testval";

        // 'timestamp' => '2017-02-24 11:07:48';
        s:9:"timestamp";s:19:"2017-02-24 11:07:48";

        // 'event' => 'notification';
        s:5:"event";s:12:"notification";

        // 'class' => App\Events\NotificationEvent::class;
        s:5:"class";s:28:"App\Events\NotificationEvent";
    }

    // protected $channel = null;
    s:10:"\0*\0channel";N;

    // protected $user = (instance of ModelIdentifier)
    s:7:"\0*\0user";O:45:"Illuminate\Contracts\Database\ModelIdentifier":2:{
        // public $class = App\User::class;
        s:5:"class";s:8:"App\User";

        // public $id = 2;
        s:2:"id";i:2;
    }

    // public $socket = null;
    s:6:"socket";N;
}

Dieses Format legt die Tatsache offen, dass Ihr Job die Eigenschaft SerializesModels verwendet, die Verweise auf Modelle durch einen einfachen Eintrag ersetzt, der Klasse + Bezeichner enthält, und sie während __wakeup.

wiederherstellt

Ich glaube, Ihr Problem liegt in der mentalen Analyse des JSON- und des Serialisierungsformats. Ihre vermutete Struktur ist ... falsch.

Die nächsten Schritte wären nichts zu erraten.1. Duplizieren Sie genau diese Testbenachrichtigung, für die Sie bereits die Nutzlast haben. Einfach kopieren und einfügen. (Möglicherweise müssen Sie die ID ändern, ich denke, sie wird für die Deduplizierung verwendet.)2. Erstellen Sie die Ereignisdaten mithilfe von PHP-Serialisierung und versuchen Sie, etwas zu erstellen, das mit der ursprünglichen Ereignisnutzlast identisch ist. Überhaupt keine Änderungen.3. Wenn es soweit funktioniert, können Sie gerne die serialisierten Ereignisdaten ändern, um zu sehen, was passiert.