Đầu tiên, hãy lưu ý rằng đây là định dạng của các công việc trong hàng đợi dựa trên cơ sở dữ liệu trong Laravel 5.3. Các phiên bản mới hơn của Laravel có các thay đổi.
Cột trọng tải phải chứa một đối tượng json có định dạng sau. Công việc (...\\[email protected]
) có thể được mã hóa cứng trong trường hợp này. Tôi tin rằng phím commandName chỉ dành cho mục đích hiển thị. Tuy nhiên, phím lệnh là phần khó hơn, nó phải là một đối tượng hợp lệ mà unserialize () hỗ trợ. Có vẻ như có các gói có sẵn trên npm cho mục đích này, một tìm kiếm nhanh đã cho thấy quá trình tuần tự hóa php.
{
"job": "Illuminate\\Queue\\[email protected]",
"data": {
"commandName": "App\\Jobs\\MyJobClass",
"command": "O:19:\"App\\Jobs\\MyJobClass\"... /* stuff */"
}
}
Tải trọng json mà bạn đã cung cấp cho kết quả trong đối tượng sau. Cả công việc và khóa dữ liệu đều quan trọng.
{
"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
}
Phần có vấn đề, tôi cho rằng, là đối tượng được tuần tự hóa. Được định dạng lại theo cách dễ đọc hơn (nhưng hoàn toàn phá vỡ nó) ...
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;
}
Định dạng này cho thấy thực tế là công việc của bạn sử dụng đặc điểm SerializesModels thay thế các tham chiếu đến các mô hình như một mục nhập đơn giản có chứa lớp + mã định danh và sẽ khôi phục chúng trong quá trình __wakeup.
Tôi tin rằng vấn đề của bạn là với việc phân tích cú pháp tinh thần của json và định dạng tuần tự hóa; cấu trúc bạn đoán là ... sai.
Các bước tiếp theo sẽ không phải đoán bất cứ điều gì. Nhân bản thông báo kiểm tra chính xác này mà bạn đã có trọng tải. Chỉ cần sao chép-dán nó. (Bạn có thể cần thay đổi id, tôi đoán nó được sử dụng để khử trùng.) 2. Xây dựng dữ liệu sự kiện bằng cách sử dụng php-serialization và nhằm mục đích xây dựng thứ gì đó giống với tải trọng sự kiện ban đầu. Không có thay đổi nào cả.3. Nếu nó hoạt động đến mức này, vui lòng thay đổi dữ liệu sự kiện được tuần tự hóa để xem điều gì sẽ xảy ra.