sql >> データベース >  >> NoSQL >> Redis

Laravelの外部からLaravelキューにプッシュする(NodeJS)

    まず、これがLaravel5.3のデータベースベースのキュー内のジョブの形式であることに注意してください。 Laravelの新しいバージョンには変更が含まれています。

    ペイロード列には、次の形式のjsonオブジェクトが含まれている必要があります。ジョブ(...\\[email protected] )このシナリオではハードコーディングできます。 commandNameキーは表示目的のみであると思います。ただし、コマンドキーは難しい部分であり、unserialize()がサポートする有効なオブジェクトである必要があります。この目的のためにnpmで利用可能なパッケージがあるようですが、クイック検索でphp-serializationが見つかりました。

    {
        "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の精神的な解析とシリアル化形式にあると思います。推測された構造は...間違っています。

    次のステップは何も推測することではありません。すでにペイロードを持っているこの正確なテスト通知を複製します。コピーして貼り付けるだけです。 (IDを変更する必要があるかもしれません。重複排除に使用されると思います。)2。 php-serializationを使用してイベントデータを構築し、元のイベントペイロードと同じものを構築することを目指します。全く変化なし3。これまでに機能する場合は、シリアル化されたイベントデータを自由に変更して、何が起こるかを確認してください。



    1. 16mbサイズを超えるドキュメントのMongoDB回避策?

    2. MySQL、MongoDB、PostgreSQLのバックアップ暗号化機能-ClusterControl 1.5.1

    3. MongoDB C#:IDシリアル化の最良のパターン

    4. phpmongodb全文検索と並べ替え