我如何很好地解码Laravel失败的工作JSON


How do i nicely decode Laravel failed jobs JSON

我应该如何解码和"美化"Laravel的失败的工作负载?

在我的DB表failed_jobs中,我有列负载,读起来像这样:

{"job":"Illuminate''Queue''CallQueuedHandler@call","data":{"commandName":"App''Jobs''createHostingOncPanel","command":"O:30:'"App''Jobs''createHostingOncPanel'":7:{s:10:'"'u0000*'u0000orderNo'";i:11;s:18:'"'u0000*'u0000hostingPackages'";s:45:'"[{'"domainName'":'"qwddqwd.io'",'"hostingType'":1}]'";s:7:'"'u0000*'u0000user'";O:45:'"Illuminate''Contracts''Database''ModelIdentifier'":2:{s:5:'"class'";s:8:'"App''User'";s:2:'"id'";i:1;}s:10:'"connection'";N;s:5:'"queue'";N;s:5:'"delay'";N;s:6:'"'u0000*'u0000job'";N;}"}}

希望将字符串json解码为可读的内容。

这是什么格式?:)

PS:这是一个Laravel 5.2版本

读取failed_jobs表

json_decode从failed_jobs表

$jsonpayload = json_decode($payload);

反序列化负载命令

$data = unserialize($jsonpayload->data->command);
print_r($data);//This is the data passed to queue

我也有问题,因为我没有直接访问生产数据库。我用auth创建了一个路由,我的控制器返回了json,所有失败的作业都格式化了。这里是控制器代码。有了这个,我还能够获得格式化的堆栈异常跟踪,由于哪个作业失败

    public function getFailedJob()
    {
        #Fetch all the failed jobs
        $jobs = DB::table('failed_jobs')->select()->get();
        #Loop through all the failed jobs and format them for json printing
        foreach ($jobs as $job) {
            $jsonpayload = json_decode($job->payload);
            $job->payload = $jsonpayload;
            $jsonpayload->data->command = unserialize($jsonpayload->data->command);
            $job->exception  = explode("'n", $job->exception);
        }
        return response()->json($jobs);
    }

我建议在事件发生时处理事件,然后以自己的方式存储所需的任何数据。您可以使用Failed Job Events捕获所有失败的作业:https://laravel.com/docs/master/queues#failed-job-events

或者您可以在作业本身上使用failed()函数:https://laravel.com/docs/master/queues#dealing-with-failed-jobs

否则,Marc的评论对我来说似乎是有意义的。

我同意最好在工作失败时处理它。但如果你想要一个懒惰的、顽固的解决方法,你可以这样做。unserialize的问题是它隐藏了受保护的属性,但公共属性返回为null

创建一个特性ExposeJobComands

<?php
namespace App'Traits;
trait ExposeJobComands {
    public function getAllVars()
    {
        return get_object_vars($this);
    }
}

让所有作业都使用这个特性。创建自定义强制转换Payload

<?php
namespace App'Casts;
use Illuminate'Contracts'Database'Eloquent'CastsAttributes;
class Payload implements CastsAttributes
{
    public function get($model, $key, $value, $attributes)
    {
        $payload = json_decode($value);
        $command = unserialize($payload->data->command);
        $payload->data->command = $command->getAllVars();
        return $payload;
    }
}

为失败的作业创建一个模型,并将负载强制转换到Payload::class

<?php
namespace App'Models;
use App'Casts'Payload;
use Illuminate'Database'Eloquent'Model;
class FailedJob extends Model
{
    protected $casts = [
        'payload' => Payload::class,
    ];
}

try this

$j = App'Models'Jobs::select('payload')->get();
$aw = json_decode($j[0]->payload)->data->command;
$cm = unserialize($aw);
dd($cm->payload);