sql >> Databasteknik >  >> NoSQL >> Redis

Tryck till Laravel-kö från utanför Laravel (NodeJS)

Observera först att detta är formatet för jobben i den databasbaserade kön i Laravel 5.3. Nyare versioner av Laravel innehåller ändringar.

Nyttolastkolumnen bör innehålla ett json-objekt av följande format. Jobbet (...\\[email protected] ) kan hårdkodas i detta scenario. Jag tror att kommandot Namn-tangenten endast är för visningsändamål. Kommandonyckeln är dock den svårare delen, den bör vara ett giltigt objekt som unserialize() stöder. Det verkar som att det finns paket tillgängliga på npm för detta ändamål, en snabb sökning gav php-serialisering.

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

Json-nyttolasten som du har tillhandahållit resulterar i följande objekt. Både jobbet och datanycklarna är viktiga.

{
  "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
}

Den problematiska delen, antar jag, är det serialiserade objektet. Omformaterad på ett sätt som är lättare att läsa (men bryter det totalt) ...

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;
}

Det här formatet avslöjar det faktum att ditt jobb använder egenskapen SerializesModels som ersätter referenser till modeller som en enkel post som innehåller klass+identifierare, och kommer att återställa dem under __wakeup.

Jag tror att ditt problem är med den mentala analysen av json och serialiseringsformatet; din gissade struktur är ... fel.

Nästa steg skulle inte vara att gissa någonting.1. Duplicera detta exakta testmeddelande som du redan har nyttolasten för. Bara att kopiera och klistra in det. (Du kan behöva ändra id:t, jag antar att det används för deduplicering.)2. Bygg händelsedata med hjälp av php-serialisering och sikta på att bygga något som är identiskt med den ursprungliga händelsenyttolasten. Inga ändringar alls.3. Om det fungerar så här långt, ändra gärna den serialiserade händelsedatan för att se vad som händer.



  1. Django REST-ramverket svarar fortfarande med cachad data även efter att ha haft tomma redis-nycklar

  2. Push och ställ in operationer i samma MongoDB-uppdatering

  3. Får tidsstämpel från mongodb id

  4. Mongoose - RangeError:Maximal anropsstapelstorlek har överskridits