我应该如何解码和"美化"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 AppTraits;
trait ExposeJobComands {
public function getAllVars()
{
return get_object_vars($this);
}
}
让所有作业都使用这个特性。创建自定义强制转换Payload
。
<?php
namespace AppCasts;
use IlluminateContractsDatabaseEloquentCastsAttributes;
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 AppModels;
use AppCastsPayload;
use IlluminateDatabaseEloquentModel;
class FailedJob extends Model
{
protected $casts = [
'payload' => Payload::class,
];
}
try this
$j = AppModelsJobs::select('payload')->get();
$aw = json_decode($j[0]->payload)->data->command;
$cm = unserialize($aw);
dd($cm->payload);