Redis
 sql >> база данни >  >> NoSQL >> Redis

Натиснете към опашката на Laravel извън Laravel (NodeJS)

Първо, имайте предвид, че това е форматът на заданията в базираната на база данни опашка в Laravel 5.3. По-новите версии на Laravel съдържат промени.

Колоната за полезен товар трябва да съдържа json обект от следния формат. Работата (...\\[email protected] ) може да бъде твърдо кодиран в този сценарий. Вярвам, че ключът commandName е само за целите на показване. Командният ключ обаче е по-трудната част, той трябва да е валиден обект, който unserialize() поддържа. Изглежда, че има пакети, налични на npm за тази цел, бързо търсене показа php-сериализация.

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

Предоставеният от вас полезен товар json води до следния обект. Както заданието, така и ключовете за данни са важни.

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

Предполагам, че проблемната част е сериализираният обект. Преформатиран по начин, който е по-лесен за четене (но напълно го нарушава) ...

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

Този формат разкрива факта, че вашата работа използва характеристиката SerializesModels, която заменя препратките към модели като обикновен запис, съдържащ клас+идентификатор, и ще ги възстанови по време на __wakeup.

Вярвам, че проблемът ви е с умствения анализ на json и сериализирания формат; Вашата предполагаема структура е ... грешна.

Следващите стъпки не биха били да гадаете нищо.1. Дублирайте това точно известие за тест, за което вече имате полезния товар. Просто го копирайте и поставете. (Може да се наложи да промените идентификатора, предполагам, че се използва за дедупликация.)2. Създайте данните за събитието с помощта на php-сериализация и се стремете да изградите нещо, идентично с оригиналния полезен товар на събитието. Без никакви промени.3. Ако работи дотук, не се колебайте да промените сериализираните данни за събитие, за да видите какво ще се случи.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Мога ли да използвам Tornado+ Celery+ RabbitMQ + Redis?

  2. Как списъците на Redis могат да се използват за внедряване на чат система?

  3. Как да създадете собствена база данни в Redis?

  4. Как да получите DIFF на сортиран набор

  5. Трябва ли да напусна клиентския си екземпляр на възел Redis с помощта на .quit()?